C++ 如何在删除en元素(double for loop)后正确地指向std::list?

C++ 如何在删除en元素(double for loop)后正确地指向std::list?,c++,iterator,unhandled-exception,erase,stdlist,C++,Iterator,Unhandled Exception,Erase,Stdlist,我想从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++) {

我想从
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++);
        }
    }

}
for(std::list::iterator it=listofcrects.begin();it!=listofcrects.end();it++)
{
for(std::list::iterator jt=listofcrects.begin();jt!=listofcrects.end();jt++)
{
如果(it==jt)
{继续;}
如果((jt->x)>(it->x)/…更多条件…)
{
jt=清除目录(jt);
//或
//擦除(jt++);
}
}
}

我得到了一个未处理的异常:
迭代器是不可加的

我认为问题在于在某些情况下(删除元素的情况下),迭代器是双倍递增的。您的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;
    }
}
for(std::list::iterator it=l.begin();it!=l.end();){//注意没有增量!
// ...
如果(秒){
它=l.擦除(它);
}否则{
++它;
}
}

因此,您正在执行一个或另一个增量,但决不能同时执行这两个增量。

我认为问题在于,在某些情况下(删除元素的情况下),您正在加倍递增迭代器。您的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;
    }
}
for(std::list::iterator it=l.begin();it!=l.end();){//注意没有增量!
// ...
如果(秒){
它=l.擦除(它);
}否则{
++它;
}
}

因此,您正在执行一个或另一个增量,但决不能同时执行这两个增量。

从列表中删除元素会使指向该元素的迭代器失效,但不会使其他迭代器失效。因此,您需要在擦除之前执行增量操作:

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++;
        }
    }
}
for(std::list::iterator it=listofcrects.begin();it!=listofcrects.end();it++){
std::list::iterator jt=listofcrects.begin();
while(jt!=listofcrects.end()){
如果(it==jt)继续;
如果((jt->x)>(it->x)/…更多条件…){
擦除(jt++);
}否则{
jt++;
}
}
}

从列表中删除元素会使指向该元素的迭代器失效,但不会使其他迭代器失效。因此,您需要在擦除之前执行增量操作:

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++;
        }
    }
}
for(std::list::iterator it=listofcrects.begin();it!=listofcrects.end();it++){
std::list::iterator jt=listofcrects.begin();
while(jt!=listofcrects.end()){
如果(it==jt)继续;
如果((jt->x)>(it->x)/…更多条件…){
擦除(jt++);
}否则{
jt++;
}
}
}

如果条件是对称的,则可以在
jt=it处启动内部循环
。如果条件是对称的,则可以在
jt=it处启动内部循环
。那么我可以做些什么来避免它呢?@Patryk:请看更新,我在键入完整答案时试图快速获取其中的基础知识:-)。那么我可以做些什么来避免它呢?@Patryk:请看更新,我在键入完整答案时试图快速获取其中的基础知识:-)。
擦除
将迭代器返回到下一个元素(或
end()
)。
erase
将迭代器返回到下一个元素(或
end()
)。