问题
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)?
回答1:
Generally I would strongly prefer v2 = v1
:
- It is shorter and makes the intend 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.
回答2:
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.
回答3:
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
.
回答4:
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.
回答5:
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.
回答6:
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.
来源:https://stackoverflow.com/questions/14977632/copying-stdvector-prefer-assignment-or-stdcopy