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

問題は、場合によっては(要素を削除する場合)、イテレータを2倍にインクリメントしていることだと思います。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 に答える