0

I don't know how to use iterator with erase.

I wanna use iterator to erase some elements. But my code has some problem.

I guess value 'end' and code 'v.erase(it++)' doesn't work. I don't know why. Is it right?

Please fix my code.

        vector<int> v = { 1,2,5,3,4 };
    auto it = v.begin();
    auto end = v.end();

    int erase_number = 5;

    while (it != end)
    {
        if (*it == erase_number)
        {
            
            v.erase(it++);
        }
        else
        {
            ++it;
        }
    }
Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335
  • 1
    Erasing an element invalidates iterators. – Jesper Juhl Nov 05 '22 at 09:34
  • 1
    *Please fix my code.* -- `v.erase(std::remove(v.begin(), v.end(), erase_number), v.end());` -- There is no need for a `while` loop. – PaulMcKenzie Nov 05 '22 at 09:34
  • See [dupe](https://stackoverflow.com/a/4645727/12002570) and [Erase element in vector while iterating the same vector](https://stackoverflow.com/questions/9927163/erase-element-in-vector-while-iterating-the-same-vector). – Jason Nov 05 '22 at 10:01

2 Answers2

1

This while loop

while (it != end)
{
    if (*it == erase_number)
    {
        
        v.erase(it++);
    }
    else
    {
        ++it;
    }
}

is in whole incorrect because after erasing an element the iterator end will be invalid. You should write at least like

while (it != v.end() )

Also instead of this statement

v.erase(it++);

you have to write

it = v.erase( it );

Pay attention to that if your compiler supports C++ 20 then you can use the standard function std::erase like

std::erase( v, 5 );
Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335
0

See Erase-Remove idiom:

vec.erase(std::remove(vec.begin(), vec.end(), erase_number), vec.end());
Aykhan Hagverdili
  • 28,141
  • 6
  • 41
  • 93