我想从一个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;
}
但是这并不起作用,因为
remove_if
接受我的函数对象的副本,所以存储的evens
向量是不可访问的。有什么正确的方法来实现这一点吗?附注:例如偶数和奇数只是举例说明,我的真正代码与此不同。因此,请不要建议以不同方式识别偶数或奇数。
boost
或者c++11
(使用ref
传递)都是可行的解决方案。 - nabulkev.erase(newEnd, v.end());` 来获得正确的结果,而不涉及“evens”。
- megabyte1024[newEnd,end)
包含未指定的值;remove_if
通常会_复制_匹配的元素;它不会交换它们。 - MSalters