【发布时间】:2010-11-19 15:44:33
【问题描述】:
iterator insert ( iterator position, const T& x );
是std::Vector类的插入操作符的函数声明。
这个函数的返回类型是一个指向被插入元素的迭代器。我的问题是,考虑到这种返回类型,什么是最有效的方式(这是我正在运行的一个更大程序的一部分,其中速度至关重要,所以我正在寻找 最 计算效率最高的方式) 在开头插入。是以下吗?
//Code 1
vector<int> intvector;
vector<int>::iterator it;
it = myvector.begin();
for(int i = 1; i <= 100000; i++){
it = intvector.insert(it,i);
}
或者,
//Code 2
vector<int> intvector;
for(int i = 1; i <= 100000; i++){
intvector.insert(intvector.begin(),i);
}
本质上,在代码 2 中,是参数,
intvector.begin()
与在代码 1 中使用返回的迭代器相比,计算“成本高”还是应该同样便宜/昂贵?
【问题讨论】:
-
添加到向量的前面意味着将所有其他元素向后移动。如果您想(不断执行)前插入,您可能真的想使用
list或deque。 -
了解如何加速程序的唯一方法是分析。您应该先编程,然后对其进行分析并找出答案。别猜了。做第二个,它更干净。 (显然,这些微优化永远不会产生影响;例如,您应该使用可以更快地插入到前面的容器,例如
deque。) -
您也可以使用 IgushArray (github.com/igushev/IgushArray),它像数组一样具有快速的常量时间访问操作,但插入/擦除操作只需 O (N^1/2) 时间。注意,结构对reserve()非常敏感
-
有一个版本的vector::insert 将一个范围(两个迭代器)作为参数而不是一个值。获取一个迭代器(最好是随机访问,但至少向前)来生成要添加的整数,然后调用一次插入:这样,向量将进行一次重新分配+洗牌,为所有新值腾出空间.
-
std::vector
::insert() 可以使您的迭代器无效,因为它可能会导致向量调整大小。
标签: c++ performance vector