根据参考参数 http://en.cppreference.com/w/cpp/container/unordered_set/emplace,
仅当新元素数量大于时才会发生重新散列max_load_factor()*bucket_count()
.
此外,[unord.req]/15 http://www.eel.is/c++draft/unord.req#15有类似的规则:
The insert
and emplace
成员不应影响迭代器的有效性,如果(N+n) <= z * B
, where N
是插入操作之前容器中元素的数量,n
是插入的元素数量,B
是容器的桶数,并且z
是集装箱的最大装载系数。
但是,请考虑以下示例:
#include <unordered_set>
#include <iostream>
int main()
{
std::unordered_set<int> s;
s.emplace(1);
s.emplace(42);
std::cout << s.bucket_count() << ' ';
std::cout << (3 > s.max_load_factor() * s.bucket_count()) << ' ';
s.emplace(2);
std::cout << s.bucket_count() << ' ';
}
使用 GCC 8.0.1,它输出
3 0 7
这意味着在放置 2 后,尽管新的元素数量 (3) 是,但会发生重新散列not比...更棒max_load_factor()*bucket_count()
(注意第二个输出是0)。为什么会发生这种情况?
你混淆了这样一个事实bucket_count()
随着迭代器的失效而改变。迭代器仅在重新散列的情况下才会失效,如果新元素数量小于或等于,则迭代器不会为 1max_load_factor()*bucket_count()
(顺便说一句,如果size()>max_load_factor()*bucket_count()
重新散列can发生,但不是必须发生)。
由于您的示例中并非如此,因此不会发生重新散列并且迭代器仍然有效。然而,必须增加存储桶数量才能容纳新元素。
我用 Mac OSX 的 clang 进行了一些实验(扩展你的代码),这使得迭代器即使在rehash(size())
(这确实改变了元素的存储桶关联,通过迭代存储桶并打印其内容直接进行测试)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)