【发布时间】:2016-07-07 16:11:56
【问题描述】:
我确实有一个数据结构:
typedef std::pair<boost::shared_ptr<X>, boost::shared_ptr<X> > pair_ptr;
std::map< pair_ptr, int >
我在迭代过程中使用。在每次迭代中,我 需要 复制 std::map 并可能销毁一个副本。但是,std::map 可以变得很大,超过 100k 个元素。这会显着减慢程序的速度。我已将 operator
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 复制构造函数和析构函数。有更快的替代方案吗?
【问题讨论】:
-
重新设计你的程序,这样你就不需要在每个迭代周围复制巨大的地图。
-
你考虑过
unordered_map吗? -
你看过
std::unordered_map或boost::flat_map吗? -
如果问题确实是由于复制造成的,我怀疑复制一个巨大的
unordered_map会比复制一个巨大的map快得多。访问其中的元素可能会更快,但不能复制它。复制它仍然需要分配 100k 节点并将它们链接在一起。 -
我支持 Ocelot。即使
flat_map也无济于事,因为尽管要复制的分配要少得多,但您仍在进行数十万次原子增量/减量。这是一个算法问题,最好有算法解决方案。