0

我想从中删除一个元素std::list,然后指向这个列表但是当我这样做时

for(std::list<CvRect>::iterator it = listOfCvRects.begin(); it != listOfCvRects.end(); it++)
{
    for(std::list<CvRect>::iterator jt = listOfCvRects.begin();  jt != listOfCvRects.end(); jt++)
    {
        if( it == jt )
        { continue;}

        if( (jt->x) > (it->x) //.. more conditions...)
        {
            jt = listOfCvRects.erase(jt);
            //OR 
            //listOfCvRects.erase(jt++);
        }
    }

}

我得到了未处理的异常:iterator is unincrementable

4

2 回答 2

4

我认为问题在于,在某些情况下(删除元素的情况),您将迭代器加倍。您的 for 循环如下所示:

for(std::list<T>::iterator jt = l.begin();  jt != l.end(); jt++) {
    ....
}

但在它里面你正在做这样的事情:

jt = l.erase(jt);

因此,如果发生擦除的情况,则擦除它,同时将迭代器设置为下一个元素...但是,您还可以使用jt++!

解决这个问题的简单方法是稍微重写 for 循环以适应这种形式:

for(std::list<T>::iterator it = l.begin(); it != l.end(); ) { // notice no increment!
    // ...
    if(cond) {
        it = l.erase(it);
    } else {
        ++it;
    }
}

所以你正在做一个或另一个增量,但从不两者兼而有之。

于 2012-01-04T23:04:51.350 回答
0

从列表中删除一个元素会使指向该元素的迭代器失效,但不会使其他迭代器失效。所以你需要在擦除之前做增量:

for(std::list<CvRect>::iterator it = listOfCvRects.begin(); it != listOfCvRects.end(); it++) {
    std::list<CvRect>::iterator jt = listOfCvRects.begin();
    while (jt != listOfCvRects.end()) {
        if( it == jt) continue;
        if( (jt->x) > (it->x) //.. more conditions...) {
            listOfCvRects.erase(jt++);
        } else {
            jt++;
        }
    }
}
于 2012-01-04T23:05:20.413 回答