Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;|列表迭代器不可递增_C++_List_Listiterator - Fatal编程技术网

C++ C++;|列表迭代器不可递增

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

我尝试遍历一个列表,然后,如果对象的车牌号与参数中给定的车牌号匹配,并且如果通行费(在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;
}
取消一次性付款(字符串和车牌号,整数分){
//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;  
                }
        }
    }