【问题标题】:Pair of vectors instead of a vector<pair>? [closed]一对向量而不是一个向量<pair>? [关闭]
【发布时间】:2012-10-24 18:53:08
【问题描述】:

我正在寻找一个可以实现类似于 std::map 和 multimap 的库,但没有树,而是向量,例如 pair&lt;vector&lt;key&gt;,vector&lt;value&gt;&gt;。该库必须保持向量同步和排序。

我想比较地图的性能,vector&lt;pair&lt;key,value&gt;&gt; 和这样的库。我不打算做一个通用的基准测试,我只想要对我的应用程序更快的东西。

我可以像其他人一样使用地图,但是-我知道我在说-我担心太多的缓存未命中。我粗心大意的猜测是,我的应用程序只做很少的分组插入和许多分散的搜索,会受益于更紧凑和连续的键。

事实上,如果我要编写代码,我会使用两个类来完成。一个未排序的版本,只允许快速的 push_back 插入,然后转换为排序的版本,该版本将采用未排序的版本,对其进行排序,可能检查重复性,然后允许快速搜索和较慢的排序插入。这实际上是 Scott Meyers 的 Effective STL 的第 23 条:“考虑用排序的向量替换关联容器”。

编辑:正如 Boost 关于 flat_(multi)map/set 的文档所指出的那样,Matt Austern 而不是 Scott Meyers 首先建议用向量替换地图和集合:http://lafstern.org/matt/col1.pdf

【问题讨论】:

标签: c++ search dictionary vector std-pair


【解决方案1】:

也许您正在寻找类似 Boost.Container 中的 flat_(multi)map/set 的东西?

【讨论】:

  • 这很有趣。但是,我看到 flat_map 使用 flat_tree,它是一个向量。我想要两个独立的向量,这样键在内存中的距离更近。这样,在搜索时不必将值带到较低(更接近 CPU)的缓存级别。
  • 我自己滚动,但奇怪的是 flat_map 对于我的特定用途来说更快。虽然没有彻底的替补。它还具有boost的优点,即经过测试,算法兼容等。
【解决方案2】:

您应该查看std::make_heap 和相关函数,它们将集合作为排序堆进行管理。它几乎完全符合您对快速、未排序插入和从已排序集合中快速检索的要求。

【讨论】:

  • 堆并没有真正排序。它们不适合搜索。
  • @MarceloCantos:嗯 - 他们确实排序。但当然,它们不允许随机查找。
  • 我不能make_heap 两个向量同时保持数据同步。我必须使用向量,就像在 boost 的 flat_map 中一样。除非我创建自己的迭代器类型,而且我宁愿不这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2017-03-05
  • 2014-01-22
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多