Search code examples
c++while-loopiteratorerase

Iterators invalidation


Hi I read in C++ primer that adding elements to a vector invalidates the iterators. I don't understand why deleting elements doesn't invalidate them as the following code works

std::vector<int> a = {1,2,3,4,5,6};

auto b = a.begin();

while (b != a.end()){
    
    if (*b%2 != 0)
        a.erase(b);
    else
        b++;
}

NOTE: This code if from C++ primer itself and cpp reference as well


Solution

  • In general this code snippet

    auto b = a.begin();
    
    while (b != a.end()){
        
        if (*b%2 != 0)
            a.erase(b);
        else
            b++;
    }
    

    is invalid. It works because the container std::vector satisfies the concept of contiguous ranges. If instead of the vector you will use for example std::list<int> when the iterator b will be invalid.

    It would be correctly to write

    auto b = a.begin();
    
    while (b != a.end()){
        
        if (*b%2 != 0)
            b = a.erase(b);
        else
            b++;
    }