正確使用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