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;
}

 

posted @ 2015-05-05 12:00  碎语心弦  阅读(4499)  评论(0编辑  收藏  举报