map::erase陷阱


map::erase函數在不同版本stl中的差異


1. C++98和C++11標准

http://www.cplusplus.com/reference/map/map/erase/

 

2. pj stl(windows)

       map::erase函數的windows實現版本(C++11標准)會返回一個map::iterator:

iterator  map::erase(const_iterator _Where);
iterator  map::erase(const_iterator _First, const_iterator _Last);
size_type map::erase(const key_type& _Keyval);

3. sgi stl(linux)

       map::erase函數的linux實現版本(C++98標准)會返回一個void:

void      map::erase(iterator __position);
void      map::erase(iterator __first, iterator __last);
size_type map::erase(const key_type& __x);

 map::erase函數的正確使用方式


       map::erase函數的正確使用方式:

typedef std::map<int, int> KG_TestMap;
typedef std::map<int, int>::iterator KG_TestMapIter;

std::map<int, int> mapTest;

for (KG_TestMapIter iter = mapTest.begin(); iter != mapTest.end();)
{
    mapTest.erase(iter++);
}

       這種方法利用了后++的特性,執行mapTest.erase(iter++)語句分成了兩個過程:
       • 后++操作將為當前iter保存一個副本tmp,然后遞增當前iter指向下一個元素,最后返回該副本tmp

       • 調用map::erase函數,tmp所指向的元素。

// code in pj stl
_Myiter operator++(int)
{ // postincrement
    _Myiter _Tmp = *this;
    ++*this;
    return (_Tmp);
}

// code in sgi stl
_Self operator++(int)
{
_Self __tmp = *this;
    _M_increment();
    return __tmp;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM