Reputation: 9385
I wanted to remove the elements of the vector based on the index, say all the even indexed elements. I have read about the erase remove idiom but can't see how to apply it. This is what I tried:
vector<int> line;
line.reserve(10);
for(int i=0;i<10;++i)
{
line.push_back(i+1);
}
for(unsigned int i=0;i<line.size();++i)
{
//remove the even indexed elements
if(i%2 == 0)
{
remove(line.begin(),line.end(),line[i]);
}
}
line.erase( line.begin(),line.end() );
This erases the entire vector. I was hoping to only remove the elements that had been marked by the remove algorithm.
Then I tried this
for(unsigned int i=0;i<line.size();++i)
{
//remove the even indexed elements
if(i%2 == 0)
{
line.erase( remove(line.begin(),line.end(),line[i]),line.end() );
}
}
This again doesn't work as there is a problem while removing, the indices seem to shift whilst iterating over the vector. What should be the correct approach to accomplish this.
Upvotes: 7
Views: 9433
Reputation: 31489
An answer that generalizes not only upon the type of container to be handled but also upon the type of container that holds the indices to be removed, is given in : Erasing elements in stl::vector by using indexes
Upvotes: 1
Reputation: 1719
Here is how to use erase-remove method to remove odd numbers from a vector. I am not sure whether you can remove elements based on the index, because remove_if() applies the predicate on the values pointed by the iterators rather than the iterator itself.
See the following : http://cplusplus.com/reference/algorithm/remove_if/
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int> v;
v.push_back(11);
v.push_back(22);
v.push_back(33);
v.push_back(44);
v.push_back(55);
v.push_back(66);
v.push_back(77);
ostream_iterator<int> printit(cout, " ");
cout << "Before removing odd numbers" << endl;
copy(v.begin(), v.end(), printit);
v.erase(remove_if(v.begin(), v.end(),
[] (int e) { return e%2 == 1; }), v.end());
cout << endl;
cout << "After removing odd numbers" << endl;
copy(v.begin(), v.end(), printit);
cout << endl;
}
Upvotes: 1
Reputation: 206508
#include <vector>
#include <algorithm>
#include <iostream>
/*Check if Index is Even or Odd*/
bool is_IndexEven(int i)
{
static int k = 1;
/*Handle Index 0 as special case as per choice*/
if(k == 1)
{
k++;
return false;
}
if(k++ % 2)
return true;
else
return false;
}
int main()
{
using namespace std;
int elements[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// create a vector that holds the numbers from 0-9.
vector<int> v(elements, elements + 10);
/*Display elements before removal*/
vector<int>::const_iterator iter = v.begin();
cout<<"Before\n";
for(iter;iter!= v.end();++iter)
{
cout<<*iter;
}
/*Remove_if + Erase Algorithm for one step removal*/
v.erase( remove_if(v.begin(), v.end(), is_IndexEven), v.end() );
/*Display result after elements removed*/
cout<<"\nAfter\n";
iter = v.begin();
for(iter;iter!= v.end();++iter)
{
cout<<*iter;
}
return 0;
}
Upvotes: 5
Reputation: 8815
By going from 0
to size
, you'll end up skipping half of the elements because the indices change as you erase the elements. Make your for
loop go from size()
to 0
:
for(unsigned int i = line.size(); i > 0; i--)
{
}
Upvotes: 10