关于STL迭代器失效

508 阅读1分钟

对于vector,当删除一个元素时,删除元素之后的所有迭代器都会失效,意思是:

因为该元素被删除时,其后面的元素都会顺次前移一位,那么对应的end()方法返回的迭代器肯定也要相应的前移,因此也对应的失效了,失效本身的意思就是当前所指向的值不再是原来所指向的值了。 而如果因为增加元素导致扩容了,那么所有的迭代器均失效,这里的所有的,包括begin()/end()/front()/cbegin()等

对于map、list,只有删除一个元素时,对应删除位置的迭代器会失效。访问失效的迭代器是否会出错,依赖于编译器的不同,比如对于下面的代码:

void Printvector(vector<int> &l)
{
    vector<int>::iterator it = l.begin();
    l.push_back(1);
    l.push_back(2);
    l.push_back(3);
    l.push_back(4);
    l.push_back(5);
    for (; it != l.end();) {
        if (*it == 2) {
            l.erase(it);
        }
        cout << *it << endl;
        it++;
    }
}

在vs2013中输出1之后,直接core掉,提示:vector iterator not dereferencable
而在gcc 4.8.5中,会顺次输出1、3、4、5