-1

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

一种方法是遍历 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) 有额外的分配,因此在空间方面占用了更多的内存。
4

3 回答 3

2

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

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

于 2012-12-17T11:49:45.940 回答
0

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

于 2012-12-17T12:05:58.977 回答
0

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

于 2012-12-17T12:09:20.220 回答