如何同时遍历两个std::set并完成指定的激活/去激活操作?
实现思路与代码
因为std::set是有序容器,但不支持随机访问(不能像向量那样用[]下标访问元素),所以我们可以用迭代器来模拟双指针的遍历逻辑,和你写的排序向量版本逻辑完全一致,只是把下标操作换成迭代器的移动。
具体实现代码
#include <set> // 假设存在activate和deactivate函数,接收int类型的索引 void activate(int idx); void deactivate(int idx); void processSets(std::set<int>& one, std::set<int>& two) { auto it1 = one.begin(); auto it2 = two.begin(); while (it1 != one.end() && it2 != two.end()) { if (*it1 < *it2) { // 仅存在于one中的元素,执行去激活 deactivate(*it1); ++it1; } else if (*it1 == *it2) { // 同时存在于两个集合,保持原有状态 ++it1; ++it2; } else { // 仅存在于two中的元素,执行激活 activate(*it2); ++it2; } } // 处理one中剩余的元素(均只存在于one中) while (it1 != one.end()) { deactivate(*it1); ++it1; } // 处理two中剩余的元素(均只存在于two中) while (it2 != two.end()) { activate(*it2); ++it2; } }
逻辑验证(对应你的示例)
- 输入集合:
one = {1,3,5,6,7,8,10}two = {2,4,6,8,10,12}
- 执行后最终激活状态:
2,4,6,8,10,12,完全符合预期。
内容的提问来源于stack exchange,提问作者Rahul Iyer
相关产品推荐
相关产品推荐

