zoukankan      html  css  js  c++  java
  • map erase iterator

    错误写法:

    map<int, int> m;
    for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
    {
        m.erase(it);  
    }

    这样会导致程序行为不可知。因为map是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。

    正确写法1(STL推荐写法):

    map<int, int> m;
    for (map<int, int>::iterator it = m.begin(); it != m.end(); )
    {
        m.erase(it++);  
    }

    使用删除之前的迭代器定位下一个元素。逻辑上来说是在for里做++和m.erase(it++)是一样的,但可能是与编译器的编译方式有关。编译器可以识别erase(it++)这样的操作并做相应优化避免不可知行为。

    正确写法2:

    map<int, int> m;
    for (map<int, int>::iterator it = m.begin(); it != m.end(); )
    {
        it = m.erase(it);  
    }

    erase()函数返回下一个元素的迭代器。

  • 相关阅读:
    Node.js Net 模块+DNS 模块
    php程序报500错误
    Node.js 工具模块-OS模块+path模块
    Node.js GET/POST请求
    Canvas动画+canvas离屏技术
    Python OS 模块
    Python random 模块
    Python time 模块
    Python 迭代器
    Python 生成器
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5962308.html
Copyright © 2011-2022 走看看