相关疑难解决方法(0)

同时迭代和修改unordered_set?

请考虑以下代码:

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某种方式搞乱以防止重复吗?

c++ c++11

30
推荐指数
2
解决办法
3690
查看次数

标签 统计

c++ ×1

c++11 ×1