我试图遍历列表然后,如果对象的板号与通过参数给出的板号相匹配,并且如果收费(以toll()计算)小于或等于给定美分,从列表中删除/删除对象。我不断收到列表迭代器无法递增的错误,我对如何修复它一无所知。
void one_time_payment(string& plate_number, int cents) {
// TODO: REWRITE THIS FUNCTION
std::list<LicenseTrip>:: iterator it;
for (it = listLicense.begin(); it != listLicense.end(); std::advance(it, 1)) {
if (it->plate_number().compare(plate_number) == 0) {
cout << "Matching Plate Found" << endl;
if (it->toll() <= cents) {
cout << "Can be paid" << endl;
it = listLicense.erase(it); //Error: list iterator cannot be incremented
}
}
}
cout << "End of Iterator" << endl;
}
答案 0 :(得分:1)
我猜,这不是编译错误,而是触发的断言。你有一个错误!
假设您在最后一个元素上,并且所有条件都适用。所以我们这样做:
it = listLicense.erase(it);
现在,it
为end()
。但就在那之后,在for循环体的末尾,我们前进it
!这是未定义的行为!因此:列表迭代器不能递增。
为了帮助我们正确地写这个,有一个list::remove_if
:
listLicense.remove_if([&](const LicenseTrip& trip){
return trip.plate_number() == plate_number &&
trip.toll() <= cents;
});
答案 1 :(得分:-2)
因此,正如Barry所解释的那样,导致失败断言的问题是迭代器会尝试将it
提升到end()
之外,这将导致未定义的行为。在我的情况下,it
只需要一次(仅用于找到匹配LicenseTrip
的{{1}}),因此在plate_number
之后放置break;
就足够了{1}}。最终的工作代码如下:
listLicense.erase(it)