[英]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
:
v2
与v1
长度不同,则std::copy
将不起作用(它不会调整大小,因此它将保留一些旧元素的最佳情况( v2.size() > v1.size()
并覆盖程序中其他地方使用的一些随机数据 v1
即将到期(并且您使用C ++ 11),您可以轻松修改它以move
内容 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.