我想从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:例如,偶数和赔率仅仅是为了清酒,我的真实代码是不同的.因此,不建议以不同方式识别偶数或赔率的方法.
解决方案不是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)