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()
)。