我有一个向量,我想删除所有奇数。我这样做了以下
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v={1,2,3,4,5,6,7,8,9};
std::vector<int>::iterator it2=v.begin();
while(it2!=v.end())
{
for ( it2= v.begin();it2!=v.end();++it2)
{
if ((*it2)%2==1){
v.erase(it2);
break;
}
}
}
for(it2=v.begin(); it2!=v.end();++it2)
std::cout<<*it2<<" ";
}
它有效:) 这只是粗糙的。我想设置一个向量列表并“捕获”迭代器 - begin()值并再用一个循环擦除。但现在我认为那是不可能的。在每次擦除后,保存的值不会有效。你有更好更有效的方式吗?
答案 0 :(得分:4)
你应该使用这样的东西:
v.erase(std::remove_if(v.begin(), v.end(), [](int i){ return bool(i % 2); }), v.end());
std::remove_if()
算法通过一次传递将未删除的元素移动到序列的前面。然后它将迭代器返回到未删除序列的末尾。然后将此迭代器用作序列的开头,该序列应与verase()
d一起v.end()
以指示序列的结束。你不会得到更有效的算法。
答案 1 :(得分:0)
你真的需要学习为你工作的STL算法。没有必要编写容易出错的循环。
使用erase()/ remove_if()习语可以轻松完成基于某些条件的删除元素,如其他答案所示。如果您没有C ++ 11,那么以下内容也足够了:
bool IsOdd(int x) { return bool(x%2); }
...
v.erase(std::remove_if(v.begin(), v.end(), IsOdd), v.end());