首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过迭代器擦除向量中的元素无效,但不会崩溃

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

Stack Overflow用户
提问于 2018-02-01 23:27:06
回答 1查看 86关注 0票数 2
代码语言:javascript
复制
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;
}

我确信热核实验堆的.It应该是这样的,否则它会崩溃。

代码语言:javascript
复制
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++入门,并用谷歌搜索它,仍然感到困惑。

EN

回答 1

Stack Overflow用户

发布于 2018-02-01 23:35:08

来自erase

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48566290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档