我可以在没有地图执行任何旋转的情况下预加载STL地图吗?

时间:2011-05-20 21:57:42

标签: c++ stl map

我已经对来自数据库的数据进行了排序以初始化STL映射。以后只有5%的数据会在地图内更改。

据我了解,每次插入都会产生轮换费用。是否可以绕过排序数据的开销?例如是否有跳过旋转的选项,另一个STL算法可以创建一个带有排序数据的平衡树?

PS:我知道最多只有2次旋转,但我想知道我是否可以进一步提高性能。

5 个答案:

答案 0 :(得分:8)

我认为你只对有效加载初始排序数据感兴趣吗?

标准map :: map (InputIterator first, InputIterator last) constructor似乎做对了。

“对于迭代器构造函数,如果元素已经根据comp排序,则迭代器之间的距离线性(复制结构)。对于未排序的序列,该距离中的线性(N * logN) (排序,复制结构)。“

答案 1 :(得分:3)

http://www.sgi.com/tech/stl/Map.html

我认为map(InputIterator f,InputIterator l)可能会对您有所帮助,但我不知道它是否考虑了要排序的数据:/

答案 2 :(得分:2)

我不相信您对STL地图引擎盖下使用的实际数据结构有任何保证。另外,如果地图没有执行旋转,请考虑插入数据的顺序(您声明它已排序)可能会对性能产生负面影响!当然,轮换意味着使用自平衡树而不是跳过列表,展开树或库作者决定的任何其他数据结构。

从数据库中检索数据所花费的时间可能会使将排序数据添加到地图中所花费的时间相形见绌。可能的优化是不按排序顺序检索数据。地图不关心排序。

答案 3 :(得分:2)

如果输入已排序,则std::map::insert(iterator, pair)函数已分摊常量成本。读取整个数据集意味着你得到O(N)。 (请注意,无论输入是否已排序,此程序都具有正确的语义。)

#include <map>
#include <iostream>
int main() {
 std::map<int, int> m;
 int a, b;
 for(std::map<int,int>::iterator it = m.begin();
     std::cin >> a >> b;
     it = m.insert(it, std::pair<int,int>(a,b))) {
  /* nothing */
 }
}

答案 4 :(得分:0)

如果必须使用地图,请考虑使用基于gcc策略的容器(如果可以)。它们比STL快得多。

http://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/interface.html