码迷,mamicode.com
首页 > 编程语言 > 详细

C++.stl map::erase陷阱

时间:2015-05-05 14:06:37      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

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陷阱

标签:

原文地址:http://www.cnblogs.com/heartchord/p/4476792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!