【发布时间】:2012-03-05 08:18:27
【问题描述】:
我想从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传递)? -
您可以在不涉及
evens的情况下执行以下for(vector<int>::iterator it = newEnd; it != v.end(); ++it) { cout<<*it<<"\n"; } v.erase(newEnd, v.end());以获得正确的结果 -
@megabyte1024:不,那行不通。
newEnd之外的元素不保证是被移除的元素。 -
@megabyte1024:不,你不能(但请参阅我的回答)。范围
[newEnd, end)包含未指定的值;remove_if通常复制个匹配元素;它不会交换它们。