Copying std::vector: prefer assignment or std::copy?
Solution 1:
Generally I would strongly prefer v2 = v1
:
- It is shorter and makes the intent more clear
-
std::copy
won't work ifv2
doesn't have the same length asv1
(it won't resize it, so it will retain some of the old elements best case (v2.size() > v1.size()
and overwrite some random data used elsewhere in the program worst case - If
v1
is about to expire (and you use C++11) you can easily modify it tomove
the contents - Performancewise assignment is unlikely to be slower then
std::copy
, since the implementers would probably usestd::copy
internally, if it gave a performance benefit.
In conclusion, std::copy
is less expressive, might do the wrong thing and isn't even faster. So there isn't really any reason to use it here.
Solution 2:
If v2
isn't big enough you'll get a buffer overrun if you use copy
as you have.
You can use a back insert iterator which will call push_back on v2
. However this could lead to multiple reallocations depending upon how big v1
is.
copy(v1.begin(), v1.end(), back_inserter(v2));
You're better off letting vector
manage things correctly. The assignment operator does this, as does vector::assign
:
v2.assign(v1.begin(), v1.end());
I have an inkling that the assignment operator is implemented in terms of vector::assign
.
Solution 3:
The invocation of std::copy
may try to access items beyond the end of the destination vector.
Use assignment.
It's not your job to micro-optimize: that's the library writer's responsibility, and ultimately the compiler's responsibility.
You can make your code arbitrarily fast if it doesn't have to be correct.
In the case of the copy
, however, it's rather doubtful whether it even is faster, and it's certainly not correct for the general case.