网站首页 > 物联资讯 > 技术分享

正确使用STL-MAP中Erase函数

2016-09-28 00:00:00 广州睿丰德信息科技有限公司 阅读
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接

一切尽在代码中。

复制代码
#include <iostream>
#include <map>
#include <string>
using namespace std ;

int main(void) 
{ 
    map<int, string> m ;
    m.insert(pair<int, string>(1, "abc")) ;
    m.insert(pair<int, string>(2, "def")) ;
    m.insert(pair<int, string>(3, "def")) ;
    m.insert(pair<int, string>(4, "ghi")) ;


    map<int, string>::iterator itor ;

    // 错误的写法
    for (itor = m.begin(); itor != m.end(); ++itor)
    {
        if (itor->second == "def")
        {
            m.erase(itor) ; // map是关联式容器,调用erase后,当前迭代器已经失效
        }
    }

    // 正确的写法
    for (itor = m.begin(); itor != m.end();)
    {
        if (itor->second == "def")
        {
            m.erase(itor++) ; // erase之后,令当前迭代器指向其后继。
        }
        else
        {
            ++itor;
        }
    }

    // 另一个正确的写法,利用erase的返回值,注意,有些版本的stl-map没有返回值,比如SGI版,但vc版的有
    for (itor = m.begin(); itor != m.end();)
    {
        if (itor->second == "def")
        {
            itor = m.erase(itor) ; // erase的返回值是指向被删除元素的后继元素的迭代器
        }
        else
        {
            ++itor;
        }
    }

    // Print m
    map<int, string>::const_iterator citor ;
    for (citor = m.begin(); citor != m.end(); ++citor)
    {
        cout << citor->first << ":" << citor->second << endl ;
    }

    getchar() ; 
    return 0 ; 
} 
复制代码RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成