迭代器擦除矢量中的元素无效,但它不会崩溃

erase an element in vector by the iterator invalid, but it DOESN'T crash

本文关键字:崩溃 无效 元素 擦除 迭代器      更新时间:2023-10-16
int main()
{
    vector<int> v;
    v.reserve(10);
    for(int i=0;i<10;i++)
        v.push_back(i);
    for(vector<int>::const_iterator iter=v.begin();iter!=v.end();iter++) {
        if(*iter==5)
            v.erase(iter);
    }
    for(vector<int>::const_iterator iter=v.begin();iter!=v.end();iter++)
        cout<<*iter<<endl;
    return 0;
}

我敢肯定它是.它应该像下面这样,否则它会崩溃。

for(vector<int>::const_iterator iter=v.begin();iter!=v.end();) {
    if(*iter==5)
       iter=v.erase(iter);
    else
        iter++;
}

但是,当我运行第一个程序时,它输出:0,1,2,3,4,6,7,8,9。我一遍又一遍地阅读C++入门书,并在谷歌上搜索它,仍然感到困惑。

从擦除:

使擦除点处或之后的迭代器和引用失效,包括 end(( 迭代器。

基本上,这意味着第一个代码片段是未定义的行为。

而且,由于它是未定义的行为,任何事情都可能发生(崩溃不是必需的,程序可能会像您预期的那样运行,直到将来的某个时刻突然崩溃(。