更快替代STL std :: map

时间:2016-07-07 16:11:57

标签: c++ boost stl

我有一个数据结构:

typedef std::pair<boost::shared_ptr<X>, boost::shared_ptr<X> > pair_ptr;
std::map< pair_ptr, int >

我在迭代过程中使用。在每次迭代中,我需要来复制std :: map并可能销毁一个副本。但是,std :: map可能变得很大,超过100k个元素。这大大减慢了程序的速度。我已经定义了运营商&lt;为:

   inline bool operator<(const pair_ptr& a, const pair_ptr& b) 
   { 
   return (a.first < b.first) or 
        (a.first == b.first and a.second < b.second);
   }

我使用std :: map复制构造函数和析构函数。有更快的替代方案吗?

1 个答案:

答案 0 :(得分:2)

您有很多选择 - 我们可以提供设计方案,但没有足够的信息为您制作。

您可以做以下三件事:

  1. 你能把钥匙指向对吗(并调整 比较适当)使对自己(包含 两个refcnt&lt; ptrs)不必复制?

  2. 在每次迭代中 - 您是否需要预期的O(log n) 插入/删除时间?如果你能和O(n)一起生活 插入/删除然后您可以使用排序的矢量作为容器 而不是地图? (这样你就可以在一个容器中分配/释放容器 拍摄而不是分配/释放大量的小树节点。)(记住:std::map 不是您可以搜索的唯一数据结构,甚至不是唯一的std:: 数据结构。所有可搜索的数据结构都可以工作,只需选择即可 具有适当复杂性保证的那个,以你的方式为模 知识&#34;常数&#34; (例如,堆分配是昂贵的),为您的 用例。)

  3. 你(你)能否管理关键所在的两件事的生命周期 指向独立于地图,这个迭代过程?如果 所以你可以拥有一对裸指针的钥匙,这将比它更快 参考在每个迭代器上创建新映射的指针。您 可以有一套独立的指针指向你所有的东西, 并在那里管理这些对象的生命周期。

  4. 这些也可以合并。只是一些让你入门的想法。