我有两个向量:
std::vector<int> v1, v2;
// Filling v1
...
现在我需要将v1
复制到v2
。有没有理由更喜欢使用
v2 = v1;
而不是
std::copy(v1.begin(),v1.end(),v2.begin());
(或者反过来)?
v2 = v1
:
std::copy
如果v2
的长度与v1
不同,则无法工作(它不会调整大小,因此在最好的情况下仍将保留一些旧元素(v2.size() > v1.size()
),并在程序中覆盖某些随机数据,最坏的情况是)。v1
即将过期(并且您使用C++11),则可以轻松修改v1
以move
内容。std::copy
慢,因为实现者可能会在内部使用std::copy
,如果它带来了性能优势。std::copy
表达能力较差,可能会做错事情,而且甚至没有更快。因此,在这里没有任何理由使用它。std::copy
是用来做什么的? - altrowarestd::list
复制到std::vector
,也不能从std::vector
的一部分复制到该向量的另一部分。 - Benjamin Lindleyv2 = v1
会导致v1的元素被复制吗? - James Wierzbavector<int>
的情况下,整数是通过 operator=
还是 int
的复制构造函数从一个向量复制到另一个向量的? - Gauthierv2
不够大,你使用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
的调用可能尝试访问目标向量末尾之外的项目。
使用赋值。
你不必微观优化:这是库作者的责任,最终是编译器的责任。
如果代码不需要正确性,那么可以使其速度任意快。
然而,在copy
的情况下,很难确定它是否更快,而且对于一般情况肯定是不正确的。
std::vector
的成员函数知道它们正在处理一个 std::vector
,并且了解它是如何实现的,而 std::copy
没有这些信息。结论是,成员函数可能做得更好(肯定不会更差)。 - James Kanze这更短。
std::copy
主要用于复制容器的部分内容。如果你需要复制整个容器,最好使用复制构造函数。
v2
不够大,你将会遭遇缓冲区溢出。 - Peter Wood就目前而言,成员函数更适合。更一般地说,每当向量的大小可能会改变或者完全更改向量的全部内容时,您应该优先考虑使用成员函数。仅在您只替换矢量内的一个小范围时,std::copy
才是适当的选择。
赋值操作更加清晰,内部使用std::copy
(或unitizalized_copy
_M_allocate_and_copy
,具体取决于大小和容量),因此性能相同。
v1
大于v2
,它将出现问题。 - jrokv1
不再需要,你可以使用v2.swap(v1);
。 - hmjd