请考虑以下代码:
unordered_set<T> S = ...;
for (const auto& x : S)
if (...)
S.insert(...);
Run Code Online (Sandbox Code Playgroud)
这打破了吗?如果我们在S中插入一些东西,那么迭代器可能会失效(由于重新散列),这将打破范围 - 因为它在使用S.begin ... S.end.
有一些模式可以解决这个问题吗?
一种方法是:
unordered_set<T> S = ...;
vector<T> S2;
for (const auto& x : S)
if (...)
S2.emplace_back(...);
for (auto& x : S2)
S.insert(move(x));
Run Code Online (Sandbox Code Playgroud)
这看起来很笨重.有没有更好的方法让我失踪?
(特别是如果我使用的是手动哈希表,并且我可以阻止它重新散列直到循环结束,那么使用第一个版本是安全的.)
更新:
来自http://en.cppreference.com/w/cpp/container/unordered_map/insert
如果由于插入而发生重新散列,则所有迭代器都将失效.否则迭代器不会受到影响.引用不会失效.仅当新元素数高于时,才会发生重新散列
max_load_factor() * bucket_count().
你能以max_load_factor某种方式搞乱以防止重复吗?