2012-12-17 49 views
-1

我有一个数组,例如ARR,并且ARR中的对象总数是已知的。 我想将ARR中每个对象的属性复制(放入)STL向量,如VEC。STL向量回推与设定值之间的性能差异

一种方式是通过ARR迭代

VEC.pushback(ARR[i].att); 

另一种方式是

VEC.resize(ARR.size()); 
VEC[i] = ARR[i].att; 

做他们做出关于运行时的性能差异?哪一个更好?谢谢。

后续行动:我想为有兴趣的人提供一些实验结果。 我试图通过将50000个整数放入STL向量来调整(1)resize()+'='和(2)reserve()+ push_back()方法。

(1) takes 0.000201s; 
(2) takes 0.000229s. 
  • 两者都使用g ++编译-O3,我运行程序几次。
  • (1)一直优于(2)。
  • (1)有额外的分配,因此在空间方面需要更多的内存。
+5

这最快的方式这是一个糟糕的问题 - 你可以简单地通过测量来自己回答。问*哪个更好*总是主观的。 –

+0

@BjörnPollex它为什么是主观的?我希望代码能够快速运行,不仅适用于我自己。 –

+0

@ jason.Z然后使用'push_back'或'emplace_back'。它更习惯。只有在投放后才担心这些事情的表现。 – Pubby

回答

2

调用resize()(或reserve())之前可能会潜在地保存一些调整大小,因为您添加新项目。无论如何,你已经知道物品的数量,所以它更有意义。

随着resize()你将有一个默认的构造一步,我会跟reserve()去防止重新分配和push_back()(在C++ 11,emplace_back()如果你的编译器支持的话)

+0

所以第二个更好? –

+1

为你自​​己测试 - 但作为一个猜测,我会这么说 - 尽管如此,你可以尝试使用'reserve()',后面跟着'push_back()'或其他函数 - 你可能会获得稍好的数字。 – Nim

+0

我刚刚做了一些实验。看到上面的后续:) –

0

我想你应该尝试QueryPerformanceCounter()函数或在执行前启动计时器,并在两种情况下执行后停止。 你可以看到时间的差异,并可以评估每个场景需要多少时间,然后决定哪一个更好的解决方案。

0

如果你想复制数组的数据,你可以简单地做VEC.assign(ARR,ARR + ARR_size) 如果ARR是一个简单的阵列,或VEC.assign(ARR.begin(),ARR.end())如果ARR是任何其它序列 这将是用于非POD型

相关问题