C++ 标准::无序地图<&燃气轮机;默认重新刷新后的存储桶计数()

C++ 标准::无序地图<&燃气轮机;默认重新刷新后的存储桶计数(),c++,std,unordered-map,C++,Std,Unordered Map,如果我一直向无序的映射添加值,那么每次元素数超过bucket\u count()(假设max\u load\u factor=1)时,都会进行重新灰化 我非常困惑的是重新灰化后桶的大小 #include <iostream> #include <unordered_map> int main() { std::unordered_map<size_t, size_t> mp; for (size_t i = 0; i < 1000; ++i

如果我一直向无序的映射添加值,那么每次元素数超过bucket\u count()(假设max\u load\u factor=1)时,都会进行重新灰化

我非常困惑的是重新灰化后桶的大小

#include <iostream>
#include <unordered_map>
int main() {
   std::unordered_map<size_t, size_t> mp;

   for (size_t i = 0; i < 1000; ++i) {
      mp[i] = i;
      std::cout << " count: " << mp.bucket_count() << std::endl;
   }
}
#包括
#包括
int main(){
std::无序地图mp;
对于(尺寸i=0;i<1000;++i){
mp[i]=i;

std::cout重新灰化后的存储桶大小将是特定于编译器的。您看到的特定数字可以通过获取当前存储桶大小,乘以2,然后从此处的uu prime_列表数组中获取大于该值的最接近的素数来找到:

这很可能是定义的实现。g++和cl使用的实现ang是开源的,我相信。标准不要求任何东西。也许素数的使用使得散列算法可以保证在散列中只需要稍微不同的对象就可以获得高度不同的位模式。@ÖTiib:这非常令人惊讶。这些映射通常都具有恒定时间插入。如果标准只要求inse,那么rtion还可以在每次插入后触发重新刷新,即使其成为线性时间操作。@FloRyan如果您担心,请保留()。根据我的经验,不同实现的std::unordered_映射在性能上相对相似。更令人惊讶的是,std::deque的块大小在实现之间确实不同,性能可能会明显不同,但无法调节块的大小,也无法保留()。