Search code examples
c++erase

Why do we need to decrement iterator while deleting from vector?


I have a below program. I need to understand why do we need to decrement pointer when we use erase method? Also is there any better way which does not create a such confusion ?

#include <iostream>
#include <vector>
using namespace std;
 

int main()
{
    vector<int> myvector{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
    for (auto i = myvector.begin(); i != myvector.end(); ++i) {
        if (*i % 2 == 0) {
            myvector.erase(i);
            i--;// why do we need to decrement ?
        }
    }
 
    // Printing the vector
    for (auto it = myvector.begin(); it != myvector.end(); ++it)
        cout << ' ' << *it;
    return 0;
}

Solution

  • I need to understand why do we need to decrement pointer when we use erase method?

    You don't, and shouldn't. The correct thing to do is use the return value of erase. At the moment your program has undefined behaviour because you are modifying an invalid iterator.

    for (auto i = myvector.begin(); i != myvector.end();) {
        if (*i % 2 == 0) {
            i = myvector.erase(i);
        } else {
            ++i;
        }
    }
    

    Also is there any better way which does not create a such confusion ?

    Yes, std::remove_if

    auto is_even = [](int i){ return (i % 2) == 0; };
    auto last = std::remove_if(myvector.begin(), myvector.end(), is_even);
    myvector.erase(last, myvector.end());