【发布时间】:2014-07-02 04:51:25
【问题描述】:
我有这样的结构:
struct client
{
string name;
double money;
};
我还有两个谓词:
bool less_10(const client& a)
{
return a.money < 10;
}
bool not_a(const client& a)
{
return a.name.at(0) != 'A';
}
在我的 main 函数中,我使用它来过滤存储在向量 client_list 中的结果(每个人的钱
if (choice_filter == 1)
{
vector<client>::iterator it3;
it3 = find_if(client_list.begin(), client_list.end(), less_10);
while (it3 != client_list.end())
{
**client_list.erase(it3);
it3 = find_if(it3 + 1, client_list.end(), less_10);
}
client_list.erase(it3);**
}
else
{
vector<client>::iterator it4;
it4 = find_if(client_list.begin(), client_list.end(), not_a);
while (it4 != client_list.end())
{
**client_list.erase(it4);
it4 = find_if(it4 + 1, client_list.end(), not_a);
}
client_list.erase(it4);**
}
我注意到,如果我先擦除,然后 find_if,我将失去最后一个客户端。所以我又添加了 1 行来擦除,但是程序崩溃了,因为迭代器现在在末尾,不能擦除。
有没有办法解决这个问题?我想继续使用带有谓词的 find_if 以及像上面那样的 while 循环,因为它们是必需的。
【问题讨论】:
-
改用
std::remove_if并使用结果调用erase。这就是你要重新发明的轮子。