C++ 我可以在不执行任何旋转的情况下预加载STL贴图吗?
我对来自数据库的数据进行了排序,以初始化STL映射。只有5%的数据稍后会在地图内部更改 据我所知,每次插入都会产生旋转的开销。是否可以绕过排序数据的开销?e、 g.是否有跳过旋转的选项和另一种STL算法来创建具有排序数据的平衡树C++ 我可以在不执行任何旋转的情况下预加载STL贴图吗?,c++,stl,map,C++,Stl,Map,我对来自数据库的数据进行了排序,以初始化STL映射。只有5%的数据稍后会在地图内部更改 据我所知,每次插入都会产生旋转的开销。是否可以绕过排序数据的开销?e、 g.是否有跳过旋转的选项和另一种STL算法来创建具有排序数据的平衡树 PS:我知道只有2个最大旋转,但我想知道我是否可以进一步提高性能。 < P>如果你必须使用一个地图,那么如果可以的话,考虑使用GCC策略容器。它们比STL快得多 我认为map(InputIterator f,InputIterator l)可能会对您有所帮助,但我不
PS:我知道只有2个最大旋转,但我想知道我是否可以进一步提高性能。
< P>如果你必须使用一个地图,那么如果可以的话,考虑使用GCC策略容器。它们比STL快得多我认为map(InputIterator f,InputIterator l)可能会对您有所帮助,但我不知道它是否考虑了正在排序的数据://我不相信您对STL映射的实际数据结构有任何保证。另外,如果插入数据的顺序(你声明它被排序)可能会对性能造成负面影响,如果地图没有执行旋转!当然,旋转意味着使用自平衡树,而不是跳过列表、散点树或库作者决定的任何其他数据结构
从数据库检索数据所花费的时间很可能会使将已排序的数据添加到映射中所花费的时间相形见绌。一种可能的优化方法是不按排序顺序检索数据。地图不会关心排序。我想您只对有效加载初始排序数据感兴趣 标准似乎做了正确的事情 “对于迭代器构造函数,迭代器之间的距离(复制构造)中的线性,如果元素已根据comp进行排序。对于未排序的序列,在该距离中的线性(N*logN)(排序,复制构造)。”标准码::映射::插入(迭代器,对)如果输入已排序,则函数具有摊余固定成本。读取整个数据集意味着得到O(N)。(请注意,无论输入是否排序,此程序都具有正确的语义。)
#包括
#包括
int main(){
std::map m;
INTA,b;
对于(std::map::iterator it=m.begin();
标准:cin>>a>>b;
it=m.insert(it,std::pair(a,b))){
/*没什么*/
}
}
我们讨论了多少数据?不管怎样,O(db访问)>O(std::map插入)
。您确定STLmap
是处理数据的最佳数据结构吗?如果输入数据已经排序vector
或deque
可能更好(使用二进制搜索特定元素访问)。“它们更快…”[需要引用]我点击该链接,发现“范围构造函数和带比较的范围构造函数一般都是O(N*log(N)),其中N是范围的大小。但是,如果范围已按值_comp()排序,则它们在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 */
}
}