为键分配字符串时是否有Map的优化版本?

时间:2018-11-17 13:57:30

标签: c++ dictionary memory

我正在使用带有字符串作为键的映射容器,但是仅使用std::map<std::string, Value>意味着键可能彼此之间不是本地的,由于高速缓存未命中,使得该容器在我的应用程序中使用的成本很高。

是否存在针对该问题的现有解决方案,该解决方案将每个密钥的数据包含在单个可感染的内存池中?

1 个答案:

答案 0 :(得分:3)

std::unordered_map 可能会为您提供帮助,因为:

  • 密钥被散列
  • 内部,这些项目存储在存储桶中,例如存储在hash table
  • 访问时间恒定

附加说明:

此代码段使您可以使用存储区界面来了解地图的布局:

    std::cout << "Bucket count: " << m.bucket_count() <<std::endl; 
    for (int i=0; i < m.bucket_count(); i++ ) {
        std::cout <<"   bucket "<< i << " : size " << m.bucket_size(i) << std::endl;
    }
    std::cout<<"Average bucket load:" <<m.load_factor()<<std::endl; 

如果您从一开始就没有预料到足够的存储桶,并且地图的动态增长导致次优的存储桶负载以及过多的碰撞,则可以重新哈希地图:

m.rehash (2*m.bucket_count() );

Online demo