复制std::vector:prefer赋值或std::copy

Copying std::vector: prefer assignment or std::copy?

本文关键字:std 赋值 copy vector 复制 prefer      更新时间:2023-10-16

我有两个向量:

std::vector<int> v1, v2;
// Filling v1
...

现在我需要将v1复制到v2。有什么理由更喜欢吗

v2 = v1;

std::copy (v1.begin(), v1.end(), v2.begin());

(反之亦然)?

一般来说,我更喜欢v2 = v1:

  1. 它更短,使意图更加清晰
  2. 如果v2的长度与v1的长度不同,std::copy将不起作用(它不会调整它的大小,因此在最坏的情况下,它将保留一些旧元素(v2.size() > v1.size()),并覆盖程序中其他地方使用的一些随机数据
  3. 如果v1即将过期(并且您使用C++11),您可以很容易地将其修改为move内容
  4. 性能分配不太可能比std::copy慢,因为实现者可能会在内部使用std::copy,如果它能带来性能优势的话

总之,std::copy的表达能力较弱,可能会做错事,甚至不会更快。所以没有任何理由在这里使用它。

如果v2不够大,如果按现有方式使用copy,则会导致缓冲区溢出。

您可以使用后插入迭代器,它将在v2上调用push_back。然而,根据v1的大小,这可能会导致多次重新分配

copy(v1.begin(), v1.end(), back_inserter(v2));

你最好让vector正确地管理事情。赋值运算符执行此操作,vector::assign:也是如此

v2.assign(v1.begin(), v1.end());

我知道赋值运算符是根据vector::assign实现的。

std::copy的调用可能会尝试访问目标向量末尾以外的项。

使用分配。

微优化不是你的工作:这是库作者的责任,最终也是编译器的责任。

如果不一定要正确的话,你可以让你的代码变得任意快。

然而,在copy的情况下,它是否更快还值得怀疑,而且对于一般情况来说,这肯定是不正确的。

它更短。

std::copy主要用于复制容器的部分。如果您需要复制整个容器,您还可以使用复制构造函数。

到目前为止的分配。更一般地说,无论何时向量的大小可能发生变化,或向量的整个内容发生变化,您都应该更喜欢成员函数。std::copy唯一合适的时间是,如果您只替换矢量内的一个小范围。

分配更清晰,内部使用std::copy(或unitizalized_copy _M_allocate_and_copy,取决于大小和容量),因此性能相同。