这个错误提示:迭代器不可以增加
exmaple:
vector<int> tVecInt; vector<int>::reverse_iterator iterInt = tVecInt.rbegin(); cout << *iterInt << endl; system("pause"); return 0;
运行结果:
这个很明显是由于迭代器越界访问导致崩溃的;
一个比较不易看出的例子:
vector<int> tVecInt = {1,2,3,4,5}; vector<int>::iterator iterInt = tVecInt.begin(); for (; iterInt < tVecInt.end(); ++iterInt) { if ((*iterInt) == 3) tVecInt.erase(iterInt); cout << *iterInt << endl; } system("pause"); return 0;
运行结果:
原因:当一个容器执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向container下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。
更好的代码写法(参考C++ Primer第五版 312页)
vector<int> tVecInt = {1,2,3,4,5}; vector<int>::iterator iterInt = tVecInt.begin(); while (iterInt!=tVecInt.end()) { if ((*iterInt) == 3) iterInt = tVecInt.erase(iterInt); else ++iterInt; } system("pause"); return 0;
如此,那个错误就不再出现了。很多代码写法是有理由的,好的代码可以更简洁,清晰易懂,出错可能性更低,更易维护