gpt4 book ai didi

c++ - 处理 vector 时如何为 find 和 find_if 使用正确的指针

转载 作者:行者123 更新时间:2023-11-28 06:48:19 26 4
gpt4 key购买 nike

我有这样的结构:

struct client
{
string name;
double money;
};

我还有 2 个谓词:

bool less_10(const client& a)
{
return a.money < 10;
}

bool not_a(const client& a)
{
return a.name.at(0) != 'A';
}

在我的主要功能中,我使用它来过滤存储在 vector client_list 中的结果(每个人的钱 < 10(选择 1)或每个名字不以 A 开头的人(其他))

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 是最好的解决方案。如果你这样做是出于教学原因(我怀疑是这种情况,给定这些特定的谓词):你在正确的轨道上。唯一的问题是 client_list.erase使迭代器无效。但是因为它返回一个迭代器在它删除的元素之后的元素,你可以使用类似于:

std::vector<Client>::iterator it 
= std::find_if( client_list.begin(), client_list.end(), predicate );
while ( it != client_list.end() ) {
it = client_list.erase( it );
it = std::find_if( it, client_list.end(), predicate );
}

并且您不想在循环后调用删除。迭代器指定结尾,那里没有要删除的元素。

关于c++ - 处理 vector 时如何为 find 和 find_if 使用正确的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com