C++ 如何在修改容器时正确迭代容器?
我想在遍历容器时修改它。但是第一个版本的代码没有正常工作。有人能解释一下原因吗C++ 如何在修改容器时正确迭代容器?,c++,loops,iterator,C++,Loops,Iterator,我想在遍历容器时修改它。但是第一个版本的代码没有正常工作。有人能解释一下原因吗 //版本1 int main(){ INTA=1,b=2,c=5; std::set m={&a,&b,&c}; 用于(自动mi:m){ std::cout查看std::set::erase的文档: 对已删除元素的引用和迭代器无效 这并不奇怪 现在,考虑一下基于范围的for循环是什么: auto && range = range_expression ; for (auto begin = begin
//版本1
int main(){
INTA=1,b=2,c=5;
std::set m={&a,&b,&c};
用于(自动mi:m){
std::cout查看std::set::erase
的文档:
对已删除元素的引用和迭代器无效
这并不奇怪
现在,考虑一下基于范围的for循环是什么:
auto && range = range_expression ;
for (auto begin = begin_expr, end = end_expr; begin != end; ++begin) {
range_declaration = *begin;
loop_statement
}
注意循环增量在迭代后如何使用当前元素的迭代器。递增无效迭代器的行为尚未定义
在第二个循环中,您总是通过调用std::set::begin
来获得有效的迭代器
在这种情况下,在迭代时修改容器是没有意义的。编写一个循环来打印所有元素,然后调用clear
以获得相同的结果
对于特定情况,通常有一种更简单的方法,如上文所述,但如果没有,通常在迭代时修改容器的正确方法是不使用范围,而是使用显式迭代器循环,并使用操作结果(无论是擦除还是插入)作为下一个迭代器值,而不是增加现在无效的迭代器。我看不出第二个解决方案有任何问题,您可以使用集合迭代器
:
#include <iostream>
#include <set>
using namespace std;
int main(){
int a=1, b=2, c=5;
set<int*> m = {&a, &b, &c};
set<int*>::iterator it = m.begin();
while(it != m.end()){
cout << **it << endl;
it = m.erase(it);
}
}
#包括
#包括
使用名称空间std;
int main(){
INTA=1,b=2,c=5;
集合m={&a,&b,&c};
set::iterator it=m.begin();
而(it!=m.end()){
库特