【问题标题】:How about storing the array indices in a map如何将数组索引存储在地图中
【发布时间】:2014-03-08 10:54:09
【问题描述】:

我的程序经常使用 boost::unordered_map,并且该地图有大约 4000 万个条目。该程序不经常进行插入或删除。它只是使用键随机访问条目。

我想知道如果我将条目值(每个大约 1 KB)存储在一个平面数组(可能是一个 std::vector)中,它会提高性能(就访问条目的速度而言),并且我使用boost::unordered_map 存储键到该数组索引的映射。

谢谢, 崔

【问题讨论】:

  • 也许吧。您会在每次想要查找索引时使用 unordered_map 吗?因为如果是这样,那将比 unordered_map 本身。如果不是,则在 unordered_map 中使用迭代器而不是索引。

标签: c++ boost map


【解决方案1】:

是的,这可以大大加快速度。事实上,这就是 Boost flat_map 的用途:)

文档相关:Non-standard containers

使用排序向量代替基于树的关联容器是 C++ 世界中众所周知的技术。 Matt Austern 的经典文章 Why You Shouldn't Use set, and What You Should Use Instead (C++ Report 12:4, April 2000, PDF) 很有启发性:

...

这给了你比你要求的更多,因为你甚至不需要多余的索引。这为您提供了更多的参考位置和更低的内存占用。最重要的是,它为您提供了更低的复杂性(-> 更少的错误),并且在接口方面可以直接替代 std::[unordered_]map

【讨论】:

  • @MooingDuck 没有。 OP 也不想使用树... :) 当然,您提出了一个有效的点,尽管路径会导致 Boost Intrusive(可能是multi_index_container<.., indexed_by<random_access<>, unordered_unique<...> >
【解决方案2】:

将值存储在像 std::vector 提供的连续内存中,将增加缓存局部性。这可能会对性能产生很大影响,但这取决于访问模式。

如果您的狩猎表现出色,请记住以下黄金法则: 总是衡量!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2013-01-29
    • 2017-07-05
    • 1970-01-01
    • 2019-12-31
    • 2023-03-17
    相关资源
    最近更新 更多