76

我有两个向量:

std::vector<int> v1, v2;

// Filling v1
...

现在我需要复制v1v2. 有没有更喜欢的理由

v2 = v1;

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

(或相反亦然)?

4

6 回答 6

93

一般来说,我强烈希望v2 = v1

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

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

于 2013-02-20T10:37:18.157 回答
14

如果v2不够大,如果copy按原样使用,则会出现缓冲区溢出。

您可以使用将调用 push_back on 的后插入迭代器v2。但是,这可能会导致多次重新分配,具体取决于大小v1

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

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

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

我有一个暗示,赋值运算符是根据vector::assign.

于 2013-02-20T10:40:14.923 回答
12

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

使用赋值。

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

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

copy然而,在.

于 2013-02-20T10:35:56.493 回答
2

它更短。

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

于 2013-02-20T10:35:22.363 回答
2

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

于 2013-02-20T10:36:44.447 回答
1

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

于 2013-02-20T10:46:41.530 回答