1.使用vector的迭代器erase元素的时候,应该注意迭代器越界的问题,eg:
for ( auto it = vec.begin(); it != vec.end(); ++it ){
if ( *it == 2 )
vec.erase(it); }
这样操作会报错“vector iterator not incrementable”;
原因:在执行完erase操作后,原来的迭代器it就失效了,其行为是不可预测的。
而erase操作会返回下一个迭代器,所以正确的做法应该是
for ( auto it = vec.begin(); it != vec.end(); ){ if ( *it == 2 ) it = vec.erase( it ); else ++it; }
2.另一个出现incrementable的原因是, 在进行迭代器遍历容器时,原来的容器不应该再继续压入任何元素了,不然容器的长度变了,迭代器就失效了。
补救的方法是,每次压入vector时,都把迭代器重置
for ( auto it = vec.begin(); it != vec.end(); ++it ){ vec.push_back( 1 ); it = vec.begin(); }
但是这样造成的死循环问题也要避免。