我想这真的取决于编译器(库实现)、编译选项和架构。在 VS2005 中进行快速基准测试,无需在 Intel Xeon 上进行优化 (/Od):
std::vector<int> a;
std::vector<int> b;
// fill 'a' with random values for giggles
timer.start()
// copy values from 'a' to 'b'
timer.stop()
我使用这些不同的“复制值...”方法获得了 10 000 000 个项目的这些结果:
- 为“b”保留空间,然后使用 for 循环
b.push_back(a[i]);
:0.808 秒
- 调整“b”的大小,然后使用索引分配进行 for 循环
b[i] = a[i];
:0.264 秒
- 无需重新调整“b”的大小,只需
b.insert(b.end(), a.begin(), a.end());
:0.021 秒(与先保留没有显着差异)
std::copy(a.begin(), a.end(), std::back_inserter(b));
: 0.944 秒(0.871 保留优先)
- 调整“b”的大小,然后在基指针上进行内存复制
memcpy(&(b[0]), &(a[0]), 10000000*sizeof(int));
:0.061 秒
然而,启用优化 (/Ox) 后,情况就不同了。我不得不将大小增加到 100 000 000 以获得更多差异化:
- push_back 循环:0.659 秒
- 索引循环:0.482 秒
- 插入:0.210 秒(与先保留没有显着差异)
- std::copy: 0.422 秒,先保留。没有它有一个 bad_alloc。
- 内存:0.329 秒
值得注意的是,无论有没有优化,插入方法都是线性缩放的。其他方法在没有优化的情况下显然效率低下,但使用它们仍然不能那么快。正如 James Kanze 所指出的,它在 g++ 上有所不同。使用您自己的平台运行测试以进行验证。