Why does this code
#include <algorithm>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.reserve(v.size() * 2); // Reserve enough space to keep iterators valid
std::copy(v.begin(), v.end(), std::back_inserter(v));
return 0;
}
give me the debug assertion failure, Expression: vector iterators incompatible (Visual C++ 2008)?
If the vector object is const-qualified, the function returns a const_iterator. Otherwise, it returns an iterator. Member types iterator and const_iterator are random access iterator types (pointing to an element and to a const element, respectively).
For reference, std::vector::swap does not invalidate iterators.
You need to make use of the begin and end method of the vector class, which return the iterator referring to the first and the last element respectively. using namespace std; vector<string> myvector; // a vector of stings. // push some strings in the vector. myvector. push_back("a"); myvector.
So to answer your question, no it does not invalidate all iterators.
Iterators corresponding to elements are only invalidated when the vector has to be reallocated, which reserve
avoids.
However, v.end()
won't stay valid.
The Standard's description of push_back
and insert
guarantees that
Causes reallocation if the new size is greater than the old capacity. If no reallocation happens, all the iterators and references before the insertion point remain valid.
v.end()
is not "before the insertion point".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With