我有两个向量:
std::vector<int> v1, v2;
// Filling v1
...
现在我需要将v1
复制到v2
。有没有理由喜欢
v2 = v1;
到
std::copy (v1.begin(), v1.end(), v2.begin());
(反之亦然)?
答案 0 :(得分:60)
一般来说,我更倾向于v2 = v1
:
std::copy
与v2
的长度不同,则v1
将无效(它不会调整大小,因此会保留一些旧元素的最佳情况(v2.size() > v1.size()
并覆盖程序中其他地方使用的一些随机数据v1
即将到期(并使用C ++ 11),您可以轻松将其修改为move
内容std::copy
慢,因为实施者可能会在内部使用std::copy
,如果它给出了性能优势。总之,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
,具体取决于尺寸和容量),或者表现相同。