【发布时间】:2016-08-26 04:34:54
【问题描述】:
我已经写了一个示例代码:
void eg(){
unordered_set<int> s;
s.insert(1);
s.insert(4);
s.insert(3);
s.insert(6);
auto ite = s.begin();
while(ite != s.end()){
int num = *ite;
cout << num << endl;
while(s.find(num+1) != s.end()){
s.erase(s.find(num));
num++;
}
while(s.find(num-1) != s.end()){
s.erase(s.find(num));
num--;
}
auto tmp = ite;
ite ++;
s.erase(tmp);
}
}
所以基本上它会创建一个集合并在其中添加 {1,3,4,6}。它遍历集合并打印元素,打印后删除集合中的所有连续元素。
所以代码应该打印类似 1,x(3 和 4 之一,因为另一个将被删除),6。
但是在我运行它之后,它打印出 3 和分段错误。 我怎样才能擦除元素并同时保持迭代器有效?
我的英语正在提高。
谢谢大家的帮助!
【问题讨论】:
-
当
num为3 时,当你到达auto tmp = ite;时ite已经失效,因为你删除了它指向的元素...