Reputation: 31
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
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() );
Upvotes: 3
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