Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why am I getting "vector iterators incompatible"?

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)?

like image 473
user541686 Avatar asked Apr 06 '13 20:04

user541686


People also ask

Do vectors have iterators?

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).

Does std :: move invalidate iterators?

For reference, std::vector::swap does not invalidate iterators.

How do you access vectors using 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.

Does pop back invalidate iterators?

So to answer your question, no it does not invalidate all iterators.


1 Answers

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".

like image 172
Ben Voigt Avatar answered Oct 04 '22 06:10

Ben Voigt