我有两个向量:
std::vector<int> v1, v2;
// Filling v1
...
Run Code Online (Sandbox Code Playgroud)
现在我需要复制v1
到v2
.有什么理由比较喜欢
v2 = v1;
至
std::copy (v1.begin(), v1.end(), v2.begin());
(或相反亦然)?
Gri*_*zly 66
一般来说我更喜欢v2 = v1
:
std::copy
如果v2
不具有相同的长度v1
将不起作用(它不会调整它的大小,因此它将保留一些旧元素的最佳情况(v2.size() > v1.size()
并覆盖程序中其他地方使用的一些随机数据)v1
即将到期(并且您使用C++ 11),您可以轻松地将其修改为move
内容std::copy
,因为实施者可能会在std::copy
内部使用,如果它给出了性能优势.总之,std::copy
表现力较差,可能做错事,甚至更快.所以在这里没有任何理由使用它.
Che*_*Alf 11
调用std::copy
可能会尝试访问目标向量末尾之外的项目.
使用分配.
微观优化不是你的工作:这是图书馆作者的责任,也是编制者的责任.
如果它不必是正确的,你可以任意快速地使你的代码.
copy
然而,在它的情况下,它是否更快是相当令人怀疑的,并且它对于一般情况肯定是不正确的.
如果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
.