正确使用STL-MAP中Erase函数


一切尽在代码中。

复制代码
#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 ; 
} 
复制代码


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM