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

时间:2018-02-01 15:27:06

标签: c++ vector iterator

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 ++入门书,并用Google搜索,感到困惑。

1 个答案:

答案 0 :(得分:3)

来自erase

  

在擦除点或之后使迭代器和引用无效,包括end()迭代器。

基本上,这意味着第一个代码片段是Undefined Behavior。

而且,由于它是未定义的行为,可能发生任何事情(不需要崩溃,程序可能会在未来的某个时刻出现,因为它会突然崩溃)。< / p>