C++中list的erase()函数问题
典型错误 for(list::iterator it=li.begin();it!=li.end();it++){ li.erase(it); } 问题: 该程序不能跳出循环 原因: li.erase(it);每次做erase时都有可能使迭代器失效,it++就发生错误了。可以参见effective stl一书。所有容器做erase操作时都有可能使迭代器失效。 因为,当list执行erase函数后,会删除对应it的元素,这时迭代器it自动更新为下一个元素的地址(下一个指删除元素的下一个)。这时再执行it++,就会把 迭代器it指向删除元素的下下个,导致最终失效,因为跳过一个元素。 正确写法有: while{ it!= li.end(); ){ if (*it % 2) { li.erase(it++); //在删除it还在时,对其++ } else { it++; } } 或者: while { it!= li.end(); ){ if (*it % 2 ) { it = li.erase(it); //erase函数返回值为删除元素的下一个元素的迭代器(其实就是一个指针),把它赋值给it,就相当于++了。我更喜欢第一种写法。 } else { it ++ ; } } 来源: oschina 链接: https://my.oschina.net/u/4385631/blog