复制std :: vector:prefer assignment还是std :: copy?

Vio*_*ffe 50 c++ stl copy

我有两个向量:

std::vector<int> v1, v2;

// Filling v1
...
Run Code Online (Sandbox Code Playgroud)

现在我需要复制v1v2.有什么理由比较喜欢

v2 = v1;

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

(或相反亦然)?

Gri*_*zly 66

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

  1. 它更短,使得打算更清晰
  2. std::copy如果v2不具有相同的长度v1将不起作用(它不会调整它的大小,因此它将保留一些旧元素的最佳情况(v2.size() > v1.size()并覆盖程序中其他地方使用的一些随机数据)
  3. 如果v1即将到期(并且您使用C++ 11),您可以轻松地将其修改为move内容
  4. 性能分配不太可能慢std::copy,因为实施者可能会在std::copy内部使用,如果它给出了性能优势.

总之,std::copy表现力较差,可能做错事,甚至更快.所以在这里没有任何理由使用它.

  • @altroware:这是从一个范围到另一个范围的一般复制.例如,您不能使用赋值运算符从`std :: list`复制到`std :: vector`,或者从`std :: vector`的一部分复制到同一个`的另一部分`的std :: VECTOR`. (19认同)
  • 那么,`std :: copy`是什么? (9认同)
  • 如果 v1 被分配到堆栈上并被破坏,会发生什么?`v2 = v1` 是否会导致 v1 的元素被复制? (4认同)
  • @james operator= 将进行完整的深层复制。惯用的 C++ 使用值语义,因此复制向量会复制其所有元素。例外情况是如果它的元素是指针,在这种情况下将复制指针。分配后,向量是独立的。 (2认同)

Che*_*Alf 11

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

使用分配.

微观优化不是你的工作:这是图书馆作者的责任,也是编制者的责任.

如果它不必是正确的,你可以任意快速地使你的代码.

copy然而,在它的情况下,它是否更快是相当令人怀疑的,并且它对于一般情况肯定是不正确的.

  • 我同意你关于优化的陈述,但值得指出的是,编译器或库可用的信息越多,它就越能完成它的工作.`std :: vector`的成员函数知道他们正在处理`std :: vector`,并知道它是如何实现的.`std :: copy`没有这个信息.结论是成员函数可能更好地完成工作(当然也不会更糟). (3认同)

Pet*_*ood 9

如果v2不够大,如果你copy按照自己的意愿使用,你将获得缓冲区溢出.

您可以使用后插入迭代器来调用push_back v2.然而,这可能会导致多次重新分配,具体取决于有多大v1.

copy(v1.begin(), v1.end(), back_inserter(v2));
Run Code Online (Sandbox Code Playgroud)

你最好让vector管理正确.赋值运算符执行此操作,如下所示vector::assign:

v2.assign(v1.begin(), v1.end());
Run Code Online (Sandbox Code Playgroud)

我有一个暗示,赋值运算符是以实现的方式实现的vector::assign.