【发布时间】:2017-09-12 13:21:41
【问题描述】:
我已经看过这篇帖子Deleting elements from STL set while iterating
不过,我想了解为什么下面的代码会产生错误的结果。
int main() {
unordered_set<int> adjacency;
adjacency.insert(1);
adjacency.insert(2);
for (const auto& n : adjacency) {
adjacency.erase(n);
}
cout <<"After removing all elements: " << endl;
for (const auto& n : adjacency) {
cout << n << " ";
}
cout << endl;
return 0;
}
邻接包含1和2。通过for循环擦除所有元素后,它仍然包含元素1。为什么?
我在下面使用版本 (2) 擦除功能,因此规则“版本 (1) 和 (3) 返回一个迭代器,指向紧跟最后一个被擦除元素的位置。”不适用?
更新:不使用 clear() 的原因是它需要一个一个地删除元素来做一些其他的处理。
by position (1)
iterator erase ( const_iterator position );
by key (2)
size_type erase ( const key_type& k );
range (3)
iterator erase ( const_iterator first, const_iterator last );
版本 (2) 返回已擦除元素的数量,在 unordered_set 容器(具有唯一值)中,如果存在值为 k 的元素(因此随后被擦除)则为 1,否则为零。
版本 (1) 和 (3) 返回一个迭代器,指向紧跟最后一个被擦除元素的位置。
谢谢!
【问题讨论】:
-
如果你要删除集合中的所有元素,为什么不在循环之后简单的clear it?
-
我更新了问题
-
"the iterators and references to the elements removed are invalidated."将此规则应用于您的情况:代码使用了无效的迭代器。行为未定义。
-
问题已更新。该规则似乎不适用于这里?
-
基于范围的 for 循环在底层使用迭代器(请参阅 this),因此它适用于此
标签: c++11 unordered-set