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