由于之前更多是使用dev,所以养成了很多编程陋习,最近趁着做图形学,强制自己好好练习使用Visual Studio,在使用list容器的迭代器的时候出现了一些意外。
//这段代码意在找出并且删除链表AET中结构体节点y值等于i的节点
for (auto erasep = AET.begin(); erasep != AET.end();erasep++ ) {
if (erasep->y == i) AET.erase(erasep);
}
这个错误翻译过来就是说:无法增量 值已经初始化的链表迭代器,也就是说链表迭代器无法自增,这是为什么呢?因为erase函数一旦执行,当前的迭代器就从链表AET中移除,因此for循环中就无法再对迭代器进行“++”操作了,所以改成下面所示就可以解决问题。
for (auto erasep = AET.begin(); erasep != AET.end(); ) {
if (erasep->y == i) AET.erase(erasep--);//
erasep++;
}
//it--很重要,因为使用erase()删除it指向的字符后,后面的字符就移了过来,it指向的位置就被后一个字符填充了,而最后的it++,又使it向后移了一个位置,所以就忽略掉了填充过来的这个字符。在这加上it--后就和it++抵消了,使迭代器能够访问所有的字符。
另外还遇到一个小问题,以下代码也会报错
auto q=AET.begin();
auto nextq=q;
nextq++;
这个问题其实就是说无法确定这个nextq是否是AET.end(),如果是的话,此时自增肯定是无效的,所以这里只需要改成如下代码:
auto q = AET.begin(), nextq = q;
if (nextq != AET.end()) nextq++;
这些经验对于vector,map也同样是适用的。