为一个非常大的列表选择一个STL容器

时间:2011-04-20 08:40:39

标签: c++ optimization stl

我有一个非常大的项目列表(约2百万),我想优化访问速度。我使用迭代器(++ it)迭代这些项目 现在,代码是使用std:map<std::wstring, STRUCT>实现的 我想知道用std::deque<std::pair<std::wstring, STRUCT>>更改std :: map是否值得。我想我会利用指针算法和最小化缓存未命中。值得吗? 我知道分析是答案,但在实现这个之前我需要一个意见......

4 个答案:

答案 0 :(得分:2)

如果事先知道尺寸,那么std :: Vector显然是你的对象不太大的方式。

std::vector<Object> list;
list.reserve(2000000);

然后像往常一样填写。

这是最快且耗能最少的方法。但是,您需要能够分配enought连续内存。但是,如果你的物体是1kb大,那就不是问题了。

答案 1 :(得分:1)

使用deque,您将失去(或将不得不重新实现)Key-Value对的优势。如果它对您的数据不重要,我会考虑使用deque。

答案 2 :(得分:1)

一般来说,如果你只是在这个集合中进行搜索(没有插入/删除),你可能最好使用一个排序的顺序投币器,如deque或vector。然后,您可以使用简单的二进制搜索来查找所需的元素。使用顺序容器的优点是它在内存使用方面更好,具有非常简单的实现,并提供更好的引用局部性。我使用vector编写了一个代码版本,使用deque编写了另一个代码版本,然后根据性能进行比较,以确定在最终版本中使用哪一个。

但是,如果您的结构需要更新(需要插入新元素或必须经常删除旧元素),那么map是更好的选择。或者,您可能只需要完全删除STL容器并使用内存数据库(请参阅SQLite),但这在很大程度上取决于您正在解决的问题。

答案 3 :(得分:1)

要迭代的最快容器通常是vector,因此如果您想以牺牲其他所有内容为代价来优化迭代,请使用它。

整体应用程序性能当然取决于您迭代的次数,以及您如何构建数据。对于简单的测试,一旦填充了地图,就可以按如下方式构建一个向量:

vector<pair<K,V> > myvec(mymap.begin(), mymap.end());

其中K和V是地图的键和值类型。然后使用向量迭代器代替map迭代器并比较性能。

当然,如果你想在将来修改地图,那么通常以牺牲其他一切为代价优化迭代是不合适的。