STL向量push_back与设定值之间的性能差异

时间:2012-12-17 11:47:30

标签: 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()方法,将50000个整数放入STL向量中。

(1) takes 0.000201s;
(2) takes 0.000229s.
  • 两者都是用g ++ -O3编译的,我运行了几次这个程序。
  • (1)始终优于(2)。
  • (1)有额外的分配,因此在空间方面占用更多的内存。

3 个答案:

答案 0 :(得分:2)

之前调用resize()(或reserve())可能会在您添加新项目时节省一些调整大小。无论如何,你已经知道了项目的数量,所以它更有意义。

使用resize(),您将拥有默认构造步骤,我将使用reserve()来阻止重新分配和push_back()(以及在C ++ 11中,emplace_back()如果你的编译器支持它)

答案 1 :(得分:0)

我认为您应该尝试使用QueryPerformanceCounter()函数或在执行前启动计时器,并在两种情况下执行后停止。 您可以看到时间上的差异,并可以评估每个方案花费的时间,然后确定哪个是更好的解决方案..

答案 2 :(得分:0)

如果你想要复制数组的数据到矢量,你可以简单地做VEC.assign(ARR,ARR + ARR_size) 如果ARR是一个简单的数组,或者是VEC.assign(ARR.begin(),ARR.end())如果arr是任何其他序列 这将是非POD类型的最快方式