C++ C++;|列表迭代器不可递增
我尝试遍历一个列表,然后,如果对象的车牌号与参数中给定的车牌号匹配,并且如果通行费(在toll()中计算)小于或等于给定的美分,则从列表中删除/擦除该对象。我一直得到一个错误,列表迭代器不能递增,我不知道如何修复它C++ C++;|列表迭代器不可递增,c++,list,listiterator,C++,List,Listiterator,我尝试遍历一个列表,然后,如果对象的车牌号与参数中给定的车牌号匹配,并且如果通行费(在toll()中计算)小于或等于给定的美分,则从列表中删除/擦除该对象。我一直得到一个错误,列表迭代器不能递增,我不知道如何修复它 void one_time_payment(string& plate_number, int cents) { // TODO: REWRITE THIS FUNCTION std::list<LicenseTrip>:: iterator it
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;
}
取消一次性付款(字符串和车牌号,整数分){
//TODO:重写此函数
std::list::迭代器;
for(it=listLicense.begin();it!=listLicense.end();std::advance(it,1)){
如果(它->车牌号()。比较(车牌号)==0){
我猜这不是一个编译错误,而是一个触发的断言。你有一个bug
假设您处于最后一个元素,并且您的所有条件都适用。因此我们:
it = listLicense.erase(it);
现在,it
是end()
为了帮助我们正确书写,有一个:
listLicense.remove_if([&](const-LicenseTrip&trip){
返回行程。车牌号()==车牌号&&
trip.toll()因此,正如Barry所解释的,导致断言失败的问题是迭代器将尝试将it
推进到end()
之外,这将给出未定义的行为。在我的例子中,it
只需要一次(仅用于定位具有匹配的车牌号的LicenseTrip
),因此在列表License.erase(it)
之后放置一个中断;
。最终工作代码如下:
void one_time_payment(string& plate_number, int cents) {
std::list<LicenseTrip>:: iterator it;
for (it = listLicense.begin(); (it != listLicense.end()) ; std::advance(it, 1)) {
if (it->plate_number().compare(plate_number) == 0 && it->toll() <= cents)
if (it->toll() <= cents) {
listLicense.erase(it);
break;
}
}
}
取消一次性付款(字符串和车牌号,整数分){
std::list::迭代器;
for(it=listLicense.begin();(it!=listLicense.end());std::advance(it,1)){
如果(它)->plate_number()。比较(plate_number)==0&&it->toll()toll()替换it=listclicense.erase(它);
与listclicense.erase(它);
。请发布一个。也无法用gcc复制。此外,代码中有一个错误。如果“if”条件返回true,这将导致未定义的行为。在这种情况下,erase()将返回end(),这将被分配给it
,循环迭代将再次递增it
。这是未定义的行为。您的代码编译良好,使用clangYou冗余测试it->toll()
void one_time_payment(string& plate_number, int cents) {
std::list<LicenseTrip>:: iterator it;
for (it = listLicense.begin(); (it != listLicense.end()) ; std::advance(it, 1)) {
if (it->plate_number().compare(plate_number) == 0 && it->toll() <= cents)
if (it->toll() <= cents) {
listLicense.erase(it);
break;
}
}
}