【问题标题】:Can anyone recommend a C++ std::map replacement container?谁能推荐一个 C++ std::map 替换容器?
【发布时间】:2008-09-24 07:43:42
【问题描述】:

地图非常适合轻松完成任务,但它们会占用内存并且存在缓存问题。当您的地图处于可能很糟糕的关键循环中时。

所以我想知道是否有人可以推荐另一个具有相同 API 但使用向量或哈希实现而不是树实现的容器。我的目标是交换容器,而不必重写所有依赖于地图的用户代码。

更新:性能方面最好的解决方案是在 std::vector 上测试地图外观

【问题讨论】:

    标签: c++ stdmap


    【解决方案1】:

    您可以使用 std::tr1::unordered_map,它已经存在于大多数 STL 实现中,并且是 C++0x 标准的一部分。

    这是它的当前签名:

    template <class Key,
              class T,
              class Hash = std::tr1::hash<Key>,
              class Pred = std::equal_to<Key>,
              class Alloc = std::allocator<std::pair<const Key, T> > >
    class unordered_map;
    

    【讨论】:

    • 我没有使用 std::tr1::unordered_map,但如果它类似于 STLport 的 hash_map,如果典型实现比 std::map 占用更大的内存,我不会感到惊讶并且具有同样糟糕的空间局部性。
    【解决方案2】:

    也许Google SparseHash 能帮到你?

    【讨论】:

      【解决方案3】:

      参见Loki::AssocVector 和/或 hash_map(大多数 STL 实现都有这个)。

      【讨论】:

      • 这基本上是一个排序的 std::vector<:pair t>> 具有类似地图的界面。许可证足够宽松,可以将其撕掉并粘贴到您的项目中。
      • 很抱歉直到现在我还没有回来检查答案,但这正是我所需要的!感谢一个完美的插入(考虑到我的用例)
      【解决方案4】:

      如果您的密钥是一种可以非常快速地比较的简单类型,并且您的条目不超过几千个,则只需将您的配对放在 std::vector 中并迭代以找到您的值,您就可以获得更好的性能。

      【讨论】:

      • 理想情况下这将是最好的解决方案,但我不想编写(和调试)向量的接口/包装器以与 Map 兼容。你知道这种技术的任何实现吗?
      • boost::property_map 概念集,尤其是 boost::vector_property_map 是您正在寻找的...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2011-12-06
      • 2010-10-17
      • 2011-05-21
      相关资源
      最近更新 更多