how to erase from vector in range-based loop?

前端 未结 3 1901
我在风中等你
我在风中等你 2021-02-05 22:30

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

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


        
3条回答
  •  别跟我提以往
    2021-02-05 22:49

    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;
    }  
    

提交回复
热议问题