gpt4 book ai didi

c++ - 无序集删除/插入循环

转载 作者:太空狗 更新时间:2023-10-29 21:00:32 24 4
gpt4 key购买 nike

std::unordered_set 的值是不可变的,因为它们既是键又是值。如果先移除、修改然后重新插入元素,则修改 std::unordered_set 元素的正确方法是什么? erase 不会使任何迭代器无效,但 insert 可能。显而易见的答案是使用 erase 返回的迭代器。我想,一种可以解决这个问题的方法是在成功插入后将循环迭代器重​​置为 unordered_set 的开头。我想确定一下,这是唯一的方法。

最佳答案

The erase does not invalidate any iterators, but the insert may.

你总是可以事先检查 insert 是否会这样做:

If rehashing occurs due to the insertion, all iterators are invalidated. Otherwise iterators are not affected. References are not invalidated. Rehashing occurs only if the new number of elements is equal to or greater than max_load_factor()*bucket_count(). (from cppreference)

因此,如果您注意重新散列,您的方法可能会奏效。当然,当您检测到重新散列发生时,您会遇到该怎么做的问题。

您可以通过在循环之前增加集合的容量来降低重新散列的可能性。

处理重新散列的最简单方法是在重新散列后重新开始。也许还有其他方法可以解决它,但我不会冒险。


说了这么多,你在这里描述的似乎表明你可能需要另一个容器。如果 unordered_set 确实是您应用程序的最佳容器,我很可能仍会选择 Martin's solution ,即带有中间容器。它不那么困惑,我可以看到发生了什么;我可以推理正确性。

关于c++ - 无序集删除/插入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21970178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com