从 unordered_set 中删除所有元素
Remove All Elements from unordered_set
我已经经历过这个postDeleting 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) 擦除功能,所以规则 "Versions (1) and (3) return an iterator pointing to the position immediately following the last of the elements erased." 不适用?
更新:不使用 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) returns 删除的元素数,在 unordered_set 容器(具有唯一值)中,如果存在值为 k 的元素(并且因此随后被删除),否则为零。
版本 (1) 和 (3) return 指向紧跟在最后一个被删除元素之后的位置的迭代器。
谢谢!
正如 Raymond 所指出的那样,您是在自欺欺人。
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
typedef unordered_set<int> adjacency_t;
typedef adjacency_t::iterator adjacencyIt_t;
adjacency_t adjacency;
adjacency.insert(1);
adjacency.insert(2);
cout <<"Before: " << endl;
for (const auto& n : adjacency) {
cout << n << " ";
}
cout << endl;
for (adjacencyIt_t i = adjacency.begin(); i!=adjacency.end(); /*empty*/)
{
// Do some processing on *i here.
adjacency.erase(i++); // Don't erase the old iterator before using it to move to the next in line.
}
cout <<"After removing all elements: " << endl;
for (const auto& n : adjacency) {
cout << n << " ";
}
cout << endl;
return 0;
}
基于范围的 for 循环在底层使用迭代器,
所以你写的东西会导致未定义的行为。
如果需要处理所有元素,然后去掉一些
他们中的一些基于一些标准,有一种方法可以做到这一点
适用于所有容器:
for(auto it = adjacency.begin(); it != adjacency.end();)
{
Process(*it);
if (Condition(*it))
it = adjacency.erase(it);
else
++it;
}
如果您需要处理所有项目,然后删除所有项目,请执行以下操作:
std::for_each(adjacency.begin(), adjacency.end(), &Process);
adjacency.clear();
我已经经历过这个postDeleting 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) 擦除功能,所以规则 "Versions (1) and (3) return an iterator pointing to the position immediately following the last of the elements erased." 不适用?
更新:不使用 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) returns 删除的元素数,在 unordered_set 容器(具有唯一值)中,如果存在值为 k 的元素(并且因此随后被删除),否则为零。
版本 (1) 和 (3) return 指向紧跟在最后一个被删除元素之后的位置的迭代器。
谢谢!
正如 Raymond 所指出的那样,您是在自欺欺人。
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
typedef unordered_set<int> adjacency_t;
typedef adjacency_t::iterator adjacencyIt_t;
adjacency_t adjacency;
adjacency.insert(1);
adjacency.insert(2);
cout <<"Before: " << endl;
for (const auto& n : adjacency) {
cout << n << " ";
}
cout << endl;
for (adjacencyIt_t i = adjacency.begin(); i!=adjacency.end(); /*empty*/)
{
// Do some processing on *i here.
adjacency.erase(i++); // Don't erase the old iterator before using it to move to the next in line.
}
cout <<"After removing all elements: " << endl;
for (const auto& n : adjacency) {
cout << n << " ";
}
cout << endl;
return 0;
}
基于范围的 for 循环在底层使用迭代器, 所以你写的东西会导致未定义的行为。
如果需要处理所有元素,然后去掉一些 他们中的一些基于一些标准,有一种方法可以做到这一点 适用于所有容器:
for(auto it = adjacency.begin(); it != adjacency.end();)
{
Process(*it);
if (Condition(*it))
it = adjacency.erase(it);
else
++it;
}
如果您需要处理所有项目,然后删除所有项目,请执行以下操作:
std::for_each(adjacency.begin(), adjacency.end(), &Process);
adjacency.clear();