当键被分配字符串时,是不是有优化的 Map 版本?

Posted

技术标签:

【中文标题】当键被分配字符串时,是不是有优化的 Map 版本?【英文标题】:Is there an optimized version of Map for when the keys are allocated strings?当键被分配字符串时,是否有优化的 Map 版本? 【发布时间】:2018-11-17 13:57:30 【问题描述】:

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

对于这个问题,是否有现成的解决方案可以将每个单独的键的数据保存在一个具有传染性的内存池中?

【问题讨论】:

你的意思是你知道你的字符串很有可能会分散在内存中?确保您首先阅读了stl map performance?,然后,如果需要,检查std::mapAlloc 参数。 看看std::map模板的第三个参数。 你是说第四个? @πάνταῥεῖ - 我忘了你可以编写自定义分配器......痛苦的记忆回到我身边 @OznOg 我的意思是 Alloc 参数,是的。 【参考方案1】:

或许,std::unordered_map 可以帮助您,因为:

键是散列的 在内部,项目存储在存储桶中,例如 hash table 访问时间是恒定的

补充说明:

这个sn-p可以让你使用bucket界面了解地图的布局:

    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

【讨论】:

我怀疑你在网上演示的代码将来能用多久。因此,在 SO 本身中过去可能是一个好主意。 (恕我直言) :) @JeJo 谢谢你的评论!实际上,与问题相关的代码中最相关的部分已经在帖子中(正是您提到的原因)。其余的相当微不足道。话虽这么说,ideone,是一家来自一家成熟公司的网站,它永远保留了代码:你可以在很多旧帖子上找到 2012 年的代码仍然可以访问 :-)

以上是关于当键被分配字符串时,是不是有优化的 Map 版本?的主要内容,如果未能解决你的问题,请参考以下文章

关于map函数的方法参考,当键的类型为String时编译错误

当键处于活动状态时,是不是可以从 ListView Builder 中隐藏元素?

当键有点字符时,对象会被破坏[重复]。

ES6通过WeakMap解决内存泄漏问题

当键具有特殊字符时,如何进行 Django 模板字典查找? [复制]

JavaScript -- Map数据结构