根据索引删除矢量元素

nik*_*hil 5 c++ stl vector erase-remove-idiom

我想基于索引删除向量的元素,比如所有偶数索引元素.我已经阅读了关于擦除删除习惯用法,但看不到如何应用它.这是我试过的:

    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() );
Run Code Online (Sandbox Code Playgroud)

这会擦除整个矢量.我希望只删除已删除算法标记的元素.

然后我尝试了这个

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() );
      }
    }
Run Code Online (Sandbox Code Playgroud)

由于在移除时存在问题,这再次不起作用,索引似乎在迭代矢量时移位.应该采取什么样的正确方法来实现这一目标.

Jos*_*phH 8

从中0开始size,你最终会跳过一半的元素,因为当你擦除元素时索引会发生变化.让你的for循环,从去size()0:

for(unsigned int i = line.size(); i > 0; i--)
{

}
Run Code Online (Sandbox Code Playgroud)

  • 没有.如果大小== 0,这会弄乱循环.无论何时你指的是元素,只需去[i-1] (3认同)
  • 我希望你的意思是'size() - 1`? (2认同)

Alo*_*ave 6

在线演示:

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 本杰明·林德利(Benjamin Lindley)评论了[类似问题的类似答案](http://stackoverflow.com/questions/23122555/removing-by-index-from-ac-vector-using-remove-if)时,“关于“ remove_if”应用谓词的顺序的假设,标准文本不予保证。” (2认同)