Search code examples
c++stlvectorerase-remove-idiom

Remove vector elements based on the index


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.


Solution

  • Online Demo:

    #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;
    }