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

时间:2013-02-20 10:32:14

标签: c++ stl copy

我有两个向量:

std::vector<int> v1, v2;

// Filling v1
...

现在我需要将v1复制到v2。有没有理由喜欢

v2 = v1;

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

(反之亦然)?

6 个答案:

答案 0 :(得分:60)

一般来说,我更倾向于v2 = v1

  1. 它更短,打算更清晰
  2. 如果std::copyv2的长度不同,则
  3. v1将无效(它不会调整大小,因此会保留一些旧元素的最佳情况(v2.size() > v1.size()并覆盖程序中其他地方使用的一些随机数据
  4. 如果v1即将到期(并使用C ++ 11),您可以轻松将其修改为move内容
  5. Performancewise赋值不可能比std::copy慢,因为实施者可能会在内部使用std::copy,如果它给出了性能优势。
  6. 总之,std::copy表达力较差,可能做错事,甚至更快。所以在这里没有任何理由使用它。

答案 1 :(得分:9)

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

使用作业。

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

如果代码不必正确,您可以快速任意

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

答案 2 :(得分:8)

如果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实现的。

答案 3 :(得分:2)

它更短。

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

答案 4 :(得分:2)

到目前为止的作业。更一般地说,任何时候矢量的大小可能会改变,或者更改矢量的整个内容,你应该更喜欢成员函数。 std::copy唯一合适的时间是你只是在向量中完全替换一个小范围。

答案 5 :(得分:1)

作业更清晰,内部使用std::copy(或unitizalized_copy _M_allocate_and_copy,具体取决于尺寸和容量),或者表现相同。