我想基于索引删除向量的元素,比如所有偶数索引元素。 我已经阅读了关于擦除删除习惯用法,但看不到如何应用它。 这就是我试过的:
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() );
这会擦除整个矢量。我希望只删除已经删除算法标记的元素。
然后我尝试了这个
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() );
}
}
这再次不起作用,因为在移除时存在问题,索引似乎在迭代矢量时移位。 应该采用什么方法来实现这一目标。
答案 0 :(得分:8)
从0
转到size
,您最终会跳过一半的元素,因为当您删除元素时索引会发生变化。让您的for
循环从size()
转到0
:
for(unsigned int i = line.size(); i > 0; i--)
{
}
答案 1 :(得分:6)
<强> 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;
}
答案 2 :(得分:4)
为什么不使用remove_if?在函数内部使用静态变量来表示当前元素的索引。
答案 3 :(得分:1)
以下是如何使用erase-remove方法从向量中删除奇数。我不确定您是否可以根据索引删除元素,因为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;
}
答案 4 :(得分:1)
答案不仅概括了要处理的容器类型,而且还概括了容纳要删除的索引的容器类型,在下面给出: Erasing elements in stl::vector by using indexes