C++ STL向量回推与设置值之间的性能差异

C++ STL向量回推与设置值之间的性能差异,c++,stl,vector,performance,C++,Stl,Vector,Performance,我有一个数组,比如ARR,ARR中的对象总数是已知的。 我想将ARR中每个对象的属性复制(放置)到STL向量中,比如说VEC 一种方法是遍历ARR VEC.pushback(ARR[i].att); 另一种方式是 VEC.resize(ARR.size()); VEC[i] = ARR[i].att; 它们对运行时性能有影响吗?哪一个更好?谢谢 后续:我想为任何感兴趣的人提供一些实验结果。 我尝试了(1)resize()+“=”和(2)reserve()+push_back()方法,将500

我有一个数组,比如ARR,ARR中的对象总数是已知的。 我想将ARR中每个对象的属性复制(放置)到STL向量中,比如说VEC

一种方法是遍历ARR

VEC.pushback(ARR[i].att);
另一种方式是

VEC.resize(ARR.size());
VEC[i] = ARR[i].att;
它们对运行时性能有影响吗?哪一个更好?谢谢

后续:我想为任何感兴趣的人提供一些实验结果。 我尝试了(1)resize()+“=”和(2)reserve()+push_back()方法,将50000个整数放入STL向量中

(1) takes 0.000201s;
(2) takes 0.000229s.
  • 两者都是用g++-O3编译的,我运行了好几次程序
  • (1) 表现始终优于(2)
  • (1) 具有额外的分配,因此在空间方面占用稍多的内存
在之前调用
resize()
(或
reserve()
)可能会在添加新项目时保存一些大小调整。无论如何,你已经知道了物品的数量,所以它更有意义


使用
resize()
您将有一个默认的构造步骤,我将使用
reserve()
来防止重新分配和
推回()在这两种情况下,在执行前启动计时器或在执行后停止。

您可以看到时间上的差异,并可以评估每个场景所需的时间,然后决定哪一个是更好的解决方案。

如果您想将数组的数据复制到向量,只需执行VEC.assign(ARR,ARR+ARR\u size) 如果ARR是一个简单数组,或者如果ARR是任何其他序列,则为VEC.assign(ARR.begin(),ARR.end())
这将是非吊舱类型的最快方法

这是一个糟糕的问题-你可以通过测量自己来回答。问哪个更好总是主观的。@BjörnPollex为什么主观?我希望代码能够快速运行,而不仅仅是为了我自己。@jason.Z使用
push_back
emplace_back
。它更地道。只需在提交后担心这些东西的性能。@Pubby是的,我正在编写代码,只需要一个快速的答案来消除我的顾虑。@jason.Z:这是主观的,因为相对性能取决于使用的编译器和库,任何人都可以做的就是测量单个编译器/库的实现。不管怎样,尼姆指出了解决办法:
reserve()
保留必要的空间以避免调整大小,然后使用
push\u back()
。“设置”(使用
运算符[]
)总是可能导致索引超出范围错误。因此,第二个更好?自己测试一下-但作为猜测,我会这么说-而不是
调整大小()
,尝试
保留()
,然后是
推回()
或我提到的其他函数-您可能会得到稍微好一点的数字。我刚才做了一些实验。请参见上面的后续内容:)