C++集合迭代器操作报错:如何遍历获取连续元素对?
解决集合成对遍历的迭代器操作错误问题
嘿,我一眼就发现问题所在啦!你应该是用了C++的std::set容器吧?它的迭代器属于双向迭代器,这种迭代器只支持++和--自增自减操作,不支持itr+1、end()-1这类直接的算术运算——只有std::vector、std::array这类容器的随机访问迭代器才能这么用。这就是你代码报错的核心原因。
你的需求是成对遍历集合(比如[1,2,3]得到{1,2}、{2,3}),咱们可以通过复制迭代器并自增的方式来实现,不用依赖算术操作。下面是修正后的代码:
// 假设X、Y是std::set<int>类型,a、count是已定义的变量 for (auto itr = X.begin(); itr != X.end(); ) { auto next_itr = itr; ++next_itr; if (next_itr == X.end()) { break; // 没有下一个元素,停止遍历 } int l1 = *next_itr - *itr; for (auto itr1 = Y.begin(); itr1 != Y.end(); ) { auto next_itr1 = itr1; ++next_itr1; if (next_itr1 == Y.end()) { break; } int l2 = *next_itr1 - *itr1; int l = std::min(l1, l2); int num = (l * l) / (a * a); count += num; ++itr1; // 移动到下一个元素 } ++itr; // 移动到下一个元素 }
关键修改点:
- 把原来依赖
end()-1的循环条件,改成在循环内部判断下一个迭代器是否到达end(),避免越界 - 用
auto next_itr = itr; ++next_itr;代替itr+1,获取当前元素的下一个迭代器 - 确保每次循环结束后手动移动迭代器(因为我们把
itr++从循环头移到了循环体末尾)
另外,如果你用的是std::vector而不是std::set,那原来的算术操作是可以的,但报错说明你用的是不支持随机访问迭代器的容器,所以上面的修改方案是通用的,适用于所有双向迭代器的容器。
内容的提问来源于stack exchange,提问作者Harshit Gupta
相关产品推荐
相关产品推荐

