You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何像操作数组一样对set进行嵌套遍历

set嵌套遍历的实现方案

C++ 标准库中的std::set是有序关联容器,底层通常为红黑树实现,本身不支持随机下标访问,你示例中直接使用s[j]的写法无法正常编译,可以通过以下两种方案实现和数组嵌套遍历等价的逻辑:


方案1:使用迭代器直接遍历set

无需额外存储空间,直接通过迭代器的偏移实现嵌套遍历,代码如下:

#include <iostream>
#include <set>

using namespace std;

int main() {
    // 示例set初始化,可替换为你的实际数据
    set<int> s = {2, 4, 6, 8, 10};

    // 外层迭代器对应原逻辑的i下标,终止条件为倒数第一个元素,等价于i < n-1
    for (auto it_i = s.begin(); it_i != prev(s.end()); ++it_i) {
        // 内层迭代器从外层迭代器的下一位开始,等价于j = i+1
        for (auto it_j = next(it_i); it_j != s.end(); ++it_j) {
            // 解引用迭代器获取元素值,对应原逻辑的s[j]
            cout << *it_j << " ";
        }
        cout << "\n"; // 可选,按外层循环分组换行
    }
    return 0;
}

关键说明:

  • prev(s.end()) 用于获取set最后一个元素的迭代器,避免外层循环到最后一个元素时内层没有可遍历的内容
  • next(it_i) 用于获取当前外层迭代器下一位的迭代器,实现j从i+1开始的逻辑
  • set的迭代器是双向迭代器,只能通过++/--/next/prev这类接口偏移,不能直接加减整数

方案2:转存到vector后按下标访问

如果不想修改原有数组遍历的下标逻辑,可以先把set元素转存到支持随机访问的vector中,代码如下:

#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main() {
    set<int> s = {2, 4, 6, 8, 10};
    // 将set所有元素转存到vector,时间复杂度O(n)
    vector<int> vec(s.begin(), s.end());
    int n = vec.size();

    // 完全沿用你原有的数组遍历逻辑即可
    for (int i = 0; i < n-1; i++) {
        for (int j = i+1; j < n; j++) {
            cout << vec[j] << " ";
        }
        cout << "\n";
    }
    return 0;
}

关键说明:

该方案适配性更强,原有数组相关的遍历逻辑不需要做任何修改,转存的性能开销极低,适合绝大多数业务场景。


内容的提问来源于stack exchange,提问作者Nirob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:45:02