我正在查看我的一些旧代码,但我意识到该代码是不正确的,因为它在重整期间使用了std::unordered_set
迭代器。为了说服自己,我编写了一个小型C ++ 11程序,该程序尝试在重新哈希后重用迭代器:
#include <unordered_set>
#include <vector>
#include <iostream>
int main() {
std::unordered_set<int> s(5);
std::vector<std::unordered_set<int>::iterator> its;
for (int i = 0; i < 100; i++) {
auto it = s.insert(i);
its.push_back(it.first);
}
s.rehash(200); // force rehash just in case...
for (auto it : its) {
std::cout << *it << "\n";
}
for (auto it2 = its[0]; it2 != s.end(); it2++) {
std::cout << *it2 << "\n";
}
for (auto it : its) {
s.erase(it);
}
std::cout << s.size() << "\n";
return 0;
}
我编译了该程序,并且能够在Valgrind上很好地运行它,这并不是我真正期望的。我尝试使用g ++(5.4.0)和clang ++(3.8.0),但在任何一种情况下都没有出现任何内存错误。有人可以解释为什么吗?它特定于提供额外“保证”的g ++和clang ++ STL实现吗?还是我的测试程序有问题。