c++11vector

how to erase from vector in range-based loop?


I simply wanna erase the specified element in the range-based loop:

vector<int> vec = { 3, 4, 5, 6, 7, 8 };
for (auto & i:vec)
{
    if (i>5)
    vec.erase(&i);
}

what's wrong?


Solution

  • You can't erase elements by value on a std::vector, and since range-based loop expose directly values your code doesn't make sense (vec.erase(&i)).

    The main problem is that a std::vector invalidates its iterators when you erase an element.

    So since the range-based loop is basically implemented as

    auto begin = vec.begin();
    auto end = vec.end()
    for (auto it = begin; it != end; ++it) {
      ..
    }
    

    Then erasing a value would invalidate it and break the successive iterations.

    If you really want to remove an element while iterating you must take care of updating the iterator correctly:

    for (auto it = vec.begin(); it != vec.end(); /* NOTHING */)
    {
      if ((*it) > 5)
        it = vec.erase(it);
      else
        ++it;
    }