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
相关产品推荐
相关产品推荐

