复制std :: vector:喜欢分配或std :: copy?
我有两个向量:
std::vector<int> v1, v2; // Filling v1 ...
现在我需要将v1
复制到v2
。 有没有什么理由更喜欢
v2 = v1;
至
std::copy (v1.begin(), v1.end(), v2.begin());
(或相反亦然)?
一般来说,我会强烈selectv2 = v1
:
- 它更短,使打算更清楚
- 如果
v2
与v1
长度不一样,std::copy
将不起作用(它不会调整它的大小,所以它会保留一些最旧的元素(v2.size() > v1.size()
并覆盖程序最坏情况下其他地方使用的一些随机数据 - 如果
v1
即将过期(并且您使用C ++ 11),则可以轻松修改它以move
内容 - Performancewise赋值不会比
std::copy
慢,因为如果赋予性能优势,实现者可能会在内部使用std::copy
。
总而言之, std::copy
不那么富有performance力,可能会做错事,甚至不会更快。 所以在这里没有任何理由使用它。
std::copy
的调用可能会尝试访问超出目标向量末尾的项目。
使用分配。
微型优化不是你的工作:这是图书馆作者的责任,最终是编译器的责任。
如果它不必是正确的,你可以任意快速地使你的代码。
然而,在copy
的情况下,它是否更快,这是相当令人怀疑的,而且一般情况下肯定是不正确的。
如果v2
不够大,你会得到一个缓冲区溢出,如果你有使用copy
。
你可以使用一个将在v2
上调用push_back的后台插入迭代器。 但是,这可能会导致多次重新分配,具体取决于v1
大小。
copy(v1.begin(), v1.end(), back_inserter(v2));
你最好让vector
正确地pipe理事情。 赋值运算符和vector::assign
:
v2.assign(v1.begin(), v1.end());
我有一个暗示,赋值运算符是用vector::assign
。
它更短。
std::copy
主要是用来复制容器的部分。 如果您需要复制整个容器,则不妨使用复制构造函数。
作业,到目前为止。 更一般的说,任何时候vector的大小都可能改变,或者改变vector的全部内容,你应该更喜欢成员函数。 唯一的时间std::copy
将是适当的,如果你只是在vector内完全replace一个小范围。
Assignement更清晰,内部使用std::copy
(或unitizalized_copy
_M_allocate_and_copy
取决于大小和容量),所以性能是相同的。