使用std :: remove_if跟踪已删除的元素

Ash*_*sha 5 c++ stl

我想从a中删除一些元素vector并使用remove_if算法来执行此操作.但我想跟踪已删除的元素,以便稍后我可以对它们执行某些操作.我用以下代码尝试了这个:

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;


struct IsEven
{
    bool operator()(int n) 
    {
        if(n % 2 == 0)
        {
            evens.push_back(n);
            return true;
        }

        return false;
    }

    vector<int> evens;
};

int main(int argc, char **argv)
{

    vector<int> v;
    for(int i = 0; i < 10; ++i)
    {
        v.push_back(i);
    }

    IsEven f;
    vector<int>::iterator newEnd = remove_if(v.begin(), v.end(), f);
    for(vector<int>::iterator it = f.evens.begin(); it != f.evens.end(); ++it)
    {
        cout<<*it<<"\n";
    }

    v.erase(newEnd, v.end());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这不能remove_if接受我的仿函数对象的副本,因此evens无法访问存储的向量.实现这一目标的正确方法是什么?

PS:例如,偶数和赔率仅仅是为了清酒,我的真实代码是不同的.因此,不建议以不同方式识别偶数或赔率的方法.

MSa*_*ers 9

解决方案不是remove_if,但它是堂兄partial_sort partition.区别在于remove_if只保证[begin, middle)包含匹配元素,但partition也保证[middle, end)包含与谓词不匹配的元素.

所以,你的例子变得公正(注意evens不再需要):

vector<int>::iterator newEnd = partition(v.begin(), v.end(), f);
for(vector<int>::iterator it = newEnd; it != v.end(); ++it)
{
    cout<<*it<<"\n";
}
v.erase(newEnd, v.end());
Run Code Online (Sandbox Code Playgroud)