繁体   English   中英

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

[英]Copying std::vector: prefer assignment or std::copy?

我有两个向量:

std::vector<int> v1, v2;

// Filling v1
...

现在我需要将v1复制到v2 有什么理由比较喜欢

v2 = v1;

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

(或相反亦然)?

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

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

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

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

使用分配。

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

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

然而,在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主要用于复制容器的各个部分。 如果需要复制整个容器,也可以使用复制构造函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM