考虑以下代码:
unordered_set<T> S = ...;
for (const auto& x : S)
if (...)
S.insert(...);
这是坏的对吗?如果我们在 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));
这似乎很笨拙。我有没有更好的方法?
(特别是如果我使用的是手动哈希表,并且我可以阻止它重新哈希直到循环结束,那么使用第一个版本是安全的。)
更新:
来自http://en.cppreference.com/w/cpp/container/unordered_map/insert
如果由于插入而发生重新散列,则所有迭代器都将失效。否则迭代器不受影响。引用不会失效。仅当新元素数高于 时才会发生重新散列
max_load_factor() * bucket_count()
。
你能以max_load_factor
某种方式搞砸以防止重新散列吗?