我有一个数据结构:
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复制构造函数和析构函数。有更快的替代方案吗?
答案 0 :(得分:2)
您有很多选择 - 我们可以提供设计方案,但没有足够的信息为您制作。
您可以做以下三件事:
你能把钥匙指向对吗(并调整 比较适当)使对自己(包含 两个refcnt&lt; ptrs)不必复制?
在每次迭代中 - 您是否需要预期的O(log n)
插入/删除时间?如果你能和O(n)
一起生活
插入/删除然后您可以使用排序的矢量作为容器
而不是地图? (这样你就可以在一个容器中分配/释放容器
拍摄而不是分配/释放大量的小树节点。)(记住:std::map
不是您可以搜索的唯一数据结构,甚至不是唯一的std::
数据结构。所有可搜索的数据结构都可以工作,只需选择即可
具有适当复杂性保证的那个,以你的方式为模
知识&#34;常数&#34; (例如,堆分配是昂贵的),为您的
用例。)
你(你)能否管理关键所在的两件事的生命周期 指向独立于地图,这个迭代过程?如果 所以你可以拥有一对裸指针的钥匙,这将比它更快 参考在每个迭代器上创建新映射的指针。您 可以有一套独立的指针指向你所有的东西, 并在那里管理这些对象的生命周期。
这些也可以合并。只是一些让你入门的想法。