根据索引删除向量元素

Remove vector elements based on the index

本文关键字:向量 元素 删除 索引      更新时间:2023-10-16

我想根据索引删除向量的元素,比如所有偶数索引的元素。我读过erase - remove习语,但不知道如何应用。这是我尝试过的:

    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() );

擦除整个向量。我希望只删除被remove算法标记的元素。

然后我试了这个

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() );
      }
    }

这再次不起作用,因为在删除时存在问题,索引似乎在迭代向量时移位。正确的方法应该是什么?

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

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

在线演示:

#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<<"Beforen";
    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<<"nAftern";
    iter = v.begin();
    for(iter;iter!= v.end();++iter)
    {
       cout<<*iter;
    }
    return 0;
}

为什么不使用remove_if呢?在函数内部使用一个静态变量来表示当前元素的索引

下面是如何使用擦除方法从向量中删除奇数。我不确定是否可以根据索引删除元素,因为remove_if()将谓词应用于迭代器所指向的值,而不是迭代器本身。

参见以下内容: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;
}

不仅概括了要处理的容器类型,还概括了保存要删除的索引的容器类型,具体答案如下:使用索引

删除stl::vector中的元素