標籤:
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;
}
C++.stl map::erase陷阱