rosudel
rosudel

Reputation: 31

How to use erase() function to erase a vector by indexing?

To traverse a vector array normally, I use indexing(see code) instead of using an iterator. Today, I have tried to erase a vector element by indexing. I have tried several times and several ways, but each time there seems to be an error in the last line(in the compiler). Please help me fix the code to erase an element by indexing. Thanks in advance.

vector<pair<int, pair<int, int> > > p;

p.push_back(make_pair(1,make_pair(2,4))) ;
p.push_back(make_pair(5,make_pair(6,7))) ;

for(int i = 0; i != p.size(); i++)
    if(p[i].first == 1)
        p.erase(i);

Upvotes: 0

Views: 85

Answers (2)

Slava
Slava

Reputation: 44238

It is not starightforward to make your code work as your indexing with i will be broken when you erase element - you need to increase i only when element is not erased.

for(int i = 0; i != p.size(); )
    if(p[i].first == 1)
        p.erase(p.begin() + i);
    else
       i++;

but you better use erase-remove idiom, as it is less error prone and more efficient (erasing in middle of vector is quite expensive):

p.erase( std::remove_if( p.begin(), p.end(), []( const auto &pair ) { return pair.first == 1; } ), p.end() );

std::remove_if()

Upvotes: 3

R Sahu
R Sahu

Reputation: 206557

You can use

for(int i = 0; i != p.size(); ) // Don't increment here.
{
    if(p[i].first == 1)
    {
        p.erase(p.begin() + i );
    }
    else
    {
       ++i;
    }
}

but it will be more idiomatic to use:

for ( auto iter = p.begin(); iter != p.end(); )
{
    if( iter->first == 1 )
    {
        iter = p.erase(iter);
    }
    else
    {
       ++iter;
    }
}

Better still, use the erase-remove idiom.

p.erase(std::remove_if(p.begin(), p.end(),
                       [](std::pair<int, std::pair<int, int>> const& item) { return item.first == 1;}),
        v.end());

Upvotes: 5

Related Questions