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

时间:2016-03-07 02:57:34

标签: c++ list listiterator

我试图遍历列表然后,如果对象的板号与通过参数给出的板号相匹配,并且如果收费(以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;
}

2 个答案:

答案 0 :(得分:1)

我猜,这不是编译错误,而是触发的断言。你有一个错误!

假设您在最后一个元素上,并且所有条件都适用。所以我们这样做:

it = listLicense.erase(it); 

现在,itend()。但就在那之后,在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)