C++ 在前面插入向量

C++ 在前面插入向量,c++,performance,vector,C++,Performance,Vector,是std::Vector类的插入运算符的函数声明 此函数的返回类型是指向插入元素的迭代器。我的问题是,考虑到这种返回类型,在开始时插入的最有效方式是什么(这是我正在运行的更大程序的一部分,速度至关重要,因此我正在寻找计算效率最高的方式)。是下面的吗 iterator insert ( iterator position, const T& x ); 与在代码1中使用返回的迭代器相比,在计算上进行评估“成本高昂”,或者两者都应该同样便宜/昂贵?如果您正在寻找一种在前端插入的计算效率高的方

std::Vector
类的插入运算符的函数声明

此函数的返回类型是指向插入元素的迭代器。我的问题是,考虑到这种返回类型,在开始时插入的最有效方式是什么(这是我正在运行的更大程序的一部分,速度至关重要,因此我正在寻找计算效率最高的方式)。是下面的吗

iterator insert ( iterator position, const T& x );

与在代码1中使用返回的迭代器相比,在计算上进行评估“成本高昂”,或者两者都应该同样便宜/昂贵?

如果您正在寻找一种在前端插入的计算效率高的方法,然后您可能希望使用deque而不是vector。

如果程序的关键需求之一是在容器的开头插入元素,那么您应该使用
std::deque
,而不是
std::vector
std::vector
只擅长在末尾插入元素


C++11中还引入了其他容器。我应该开始用这些新容器找到一个更新后的图表,并将其插入此处。

获取插入点的效率一点也不重要-每次插入时不断将现有数据乱序的效率会让它相形见绌


使用std::deque,这就是它的设计目的。

当你使用向量时,你通常知道它将拥有的元素的实际数量。在这种情况下,保留所需数量的元素(在您显示的示例中为100000)并使用
[]
运算符填充它们是最快的方法。如果您确实需要在前端进行高效插入,则可以使用
deque
list
,具体取决于您的算法


你也可以考虑反转算法的逻辑并在末尾插入,这对于向量来说通常更快。

如果你真的想在开始时插入数据,我想你应该改变容器的类型。这就是vector没有push_front()成员函数的原因。

很可能是其他人建议的适当解决方案。但是为了完整起见,假设您只需要执行一次前端插入,在程序中的其他地方不需要在前端执行其他操作,并且以其他方式
vector
提供您需要的接口。如果所有这些都是真的,您可以使用非常有效的
向后推
,然后
反向推
向量来添加项目,以使所有内容都井然有序。这将具有线性复杂性,而不是像在前端插入时那样具有多项式复杂性。

一个旧线程,但它作为谷歌查询的第一个搜索结果出现在同事的办公桌上

有一种替代使用deque的方法值得考虑:

intvector.begin() 
std::vector foo;
对于(int i=0;i<100000;++i)
foo.向后推(T());
std::reverse(foo.begin(),foo.end());
在性能方面,您仍然使用比deque更为工程化的向量。此外,互换(逆向使用的是互换)也相当有效。另一方面,复杂度虽然仍然是线性的,但增加了50%


和往常一样,在决定做什么之前先进行测量。

直觉上,我同意@Happy Green Kid打盹,并进行了一个小测试,表明对于小尺寸(1在向量前面添加意味着将所有其他元素向后移动)。如果你想(持续执行)在插入之前,您可能真的想使用
list
deque
。知道如何加快程序速度的唯一方法是分析。您应该先编写程序,然后分析它并找出答案。停止猜测。做第二个,它更干净。(很明显,这些微优化永远不会有什么不同;举个例子,你应该使用一个可以更快地插入到前端的容器,比如
deque
)你也可以使用IgushArray(),它像数组一样具有快速的定时访问操作,但是插入/擦除操作只需要O(N^1/2)时间。小心,结构对reserve()非常敏感。有一个版本的vector::insert将范围(两个迭代器)作为参数而不是值。获取迭代器(最好是随机访问,但至少是向前)生成要添加的整数,并对insert进行一次调用:这样,向量将进行一次重新分配+洗牌,为所有新值留出空间。std::vector::insert()可以使您的迭代器无效,因为它可能导致向量调整大小。使用<代码>列表<代码>的唯一情况是当您需要<代码>剪接< /代码>成员时。使用<代码> DeQue>代码>。不仅如此。根据该图,当插入中间时,我们应该使用STD::List.@比利——这不是使用列表的唯一情况。您使用列表。如果您需要频繁地插入或删除列表中间的元素,或者调用需要这些操作的函数(如splice或sort)@PigBen:sort实际上在列表中的速度会慢一些,因为sort实际上并不删除任何内容—它只需要比较和交换。(好的,如果对象很大,交换操作可以稍微便宜一点,但这是一个不正常的用例)“中间插入”的问题论点是要到达列表的中间需要线性时间。如果你能让迭代器一直指向你需要的地方,就一定要使用列表。然而,我想我从来没有见过有人使用列表来达到这个目的;通常我想要的是deque。看起来原稿在这里…?谢谢。我会研究deque。我希望像deque一样ctor类,deque类还允许通过对象[index]访问其元素。在我的应用程序中,插入是问题的一部分…访问元素是另一部分。@Tryer,是的,deque支持通过
[]
表示法快速访问。速度不如vector快,但ad
//Code 2
vector<int> intvector;
for(int i = 1; i <= 100000; i++){
    intvector.insert(intvector.begin(),i);
}
intvector.begin() 
std::vector<T> foo;
for (int i = 0; i < 100000; ++i)
  foo.push_back(T());
std::reverse( foo.begin(), foo.end() );