提问人:QuickDzen 提问时间:11/12/2023 最后编辑:wohlstadQuickDzen 更新时间:11/13/2023 访问量:128
使用 unordered_set/unordered_multiset 的迭代器失效
Iterator invalidation with unordered_set/unordered_multiset
问:
我知道在插入元素时可能会使迭代器失效:unordered_set
“如果发生重新散列(由于插入),所有迭代器都将失效。”
很明显,因为我们有带桶的哈希表,但为什么不使迭代器失效呢?
我认为的实现与(带有存储桶的哈希表)的实现几乎相同。unordered_multiset
unordered_set
unordered_multiset
答:
实际上,在这方面,和 之间没有区别。std::unordered_set
std::unordered_multiset
正如您在 unordered_multiset::
insert 中所看到的,它包含与 unordered_set::insert 完全相同的注释:
如果发生重新散列(由于插入),则所有迭代器都将失效。
顺便说一句 - 在没有重新散列的情况下,它们也是相同的:
否则(不重新散列),迭代器不会失效。
请注意,这并不意味着两个容器在使迭代器失效时总是表现相同 - 因为实现有一定的自由度(调整桶计数等,这可能会影响重新散列 - 请参阅下面的 @TonyDelroy 评论)。
评论
load_factor
max_load_factor
在 C++ 标准库中,插入期间迭代器失效的 unordered_set 和 unordered_multiset 的行为可能看起来很相似,但在处理重复项的方式上存在关键差异。
unordered_set:
在unordered_set中,每个元素都是唯一的,如果超过负载因子阈值,插入操作可能会导致重新散列。 重新哈希涉及更改哈希表中的存储桶数量,这可能会使迭代器失效,因为元素可能会移动到新位置。 unordered_multiset:
In an unordered_multiset, duplicate elements are allowed. When you insert an element, the insert operation adds it to the appropriate bucket without considering rehashing due to load factors. Since the number of buckets doesn't change during regular insertions (only when the container is resized), iterators are generally not invalidated during insertions.
存储桶中的现有元素不会受到插入新元素的影响,迭代器仍然可以指向正确的存储桶。
总之,主要区别在于对重复项的处理。在unordered_multiset中,新元素的插入不会像unordered_set中那样触发重新散列,因此,迭代器在常规插入期间不太可能失效。检查您正在使用的 C++ 实现的特定文档或标准始终很重要,因为详细信息可能因不同的标准库实现而异。
是的,有区别,可能没有那么大,但它仍然是一个非常有效的@wohlstad
评论
unordered_multiset
unordered_set
unordered_multimap
评论
unordered_multiset
不会使迭代器失效?你能添加对这个声明的引用吗?