Copying std::vector: prefer assignment or std::copy?
C++StlCopyC++ Problem Overview
I have two vectors:
std::vector<int> v1, v2;
// Filling v1
...
And now I need to copy v1
to v2
. Is there any reason to prefer
v2 = v1;
to
std::copy (v1.begin(), v1.end(), v2.begin());
(or vice versa)?
C++ Solutions
Solution 1 - C++
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 - C++
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 - C++
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.
Solution 4 - C++
It's shorter.
std::copy
is mainly meant for copying sections of containers. If you need to copy an entire container, you might as well use the copy constructor.
Solution 5 - C++
Assignment, by far. More generally, any time the size of the vector might change, or change the entire contents of the vector, you should prefer member functions. The only time std::copy
would be appropriate is if you are only replacing a small range totally within the vector.
Solution 6 - C++
Assignement is clearer and internally uses std::copy
(or unitizalized_copy
_M_allocate_and_copy
depending size and capacity) or so performances are the same.