捕获列表中的迭代器差异并使用它来擦除向量的元素

时间:2013-12-30 02:26:29

标签: c++ vector iterator

我有一个向量,我想删除所有奇数。我这样做了以下

#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()值并再用一个循环擦除。但现在我认为那是不可能的。在每次擦除后,保存的值不会有效。你有更好更有效的方式吗?

2 个答案:

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