STL中map的方法erase()问题

xiaohutushen30 2013-04-08 04:38:56
对erase方法不是特别了解的先看一下这个资料http://hi.baidu.com/sdkinger/item/dcad78e374707ff12b09a453
#include "stdafx.h"
#include <map>
#include <iostream>
using namespace std;

typedef map<int,int> rqInfo;
int main()
{
rqInfo Map;
Map.insert(rqInfo::value_type(1,10));
Map.insert(rqInfo::value_type(2,20));
Map.insert(rqInfo::value_type(3,30));


rqInfo rqinfomap;

rqinfomap = Map;
rqInfo::iterator Iterator= Map.begin();
rqInfo::iterator Iteratortemp=Iterator;
printf("index=%d\n",Iterator->second);
printf("index=%d\n",Iteratortemp->second);
Map.erase(Iterator);
Iteratortemp++;//此处为什么Iterator失效后,Iteratortemp也跟着失效了呢,莫非是删除此元素的位置之后,所有引用此处的迭代器都会失效,懂的可以讲解一下。
printf("index=%d\n",Iteratortemp->second);
}
...全文
390 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2014-09-18
  • 打赏
  • 举报
回复
最后一个回复说到点子上了
xiaohutushen30 2013-04-09
  • 打赏
  • 举报
回复 1
_Myiter operator++(int) { // postincrement _Myiter _Tmp = *this; ++*this; return (_Tmp); } 还是到源码中找呀,单步调试的时候,按F11调试erase(iterator++);进入到函数后,先到用运算符重载++,而++的代码如上面,其实就相当于Iterator还是先自增一下,然后++函数返回原来的iterator所指向的元素迭代器,也就是说iterator先自增,然后再删除没有自增前的元素。
palm008 2013-04-09
  • 打赏
  • 举报
回复
迭代器指向的元素删除后,迭代器就失效了。
有新工作否 2013-04-09
  • 打赏
  • 举报
回复
你把倒数第二句和第三句调整一下,是可以正常运行的!!
有新工作否 2013-04-09
  • 打赏
  • 举报
回复
刚才看了你的代码,你真是人才,你把倒数第二句和第三句倒过来。map是二叉树式结构,都是用指针链接的,所以你删除其中一个,不会影响其他的迭代器。 这是你代码的错,你还没加呢,先删除了,楼主人才,把大家都忽悠了一顿!!
mujiok2003 2013-04-09
  • 打赏
  • 举报
回复
迭代器指针的泛化,可以当指针来理解。

rqInfo::iterator Iteratortemp=Iterator;//Iteratortemp是Iterator的拷贝
//....
Map.erase(Iterator);//传递的是Iterator的拷贝
//这里共有迭代器,类似于三个指向同一地址的指针
//因为在erase中,会释放Iterator所指向的内存/资源
//所以所有指向刚被释放的那块地址的迭代器都失效了
黑娃 2013-04-09
  • 打赏
  • 举报
回复
引用 10 楼 xiaohutushen30 的回复:
大家关注一下7楼的问题呀!!现在是7楼那个问题不明白!
map是不能这么搞的,因为map erase后会调整顺序,迭代器是真的失效了。在++就不知道加到什么地方去了 但是vector可以这么搞,因为vector只是把内存整体往前挪动一格,这种失效是可以捕捉到的,再++的地方是可以预测到的。
有新工作否 2013-04-09
  • 打赏
  • 举报
回复
引用 11 楼 xiaohutushen30 的回复:
erase(iterator++);这句出来就不明白了,iterator++会先使用iterator去删除元素,但元素删除之后iterator就失效了,他还怎么能自增呢???
应该不会自增的吧,map我不知道,vector每次删除或者增加容量(是容量,不是元素),都要重新分配内存。原来的内存全部消除,重新选择一块较大内存存储,所以迭代器自然会失效。所以vector增加或者删除容量代价还是比较大的,频繁操作,会产生很多内存碎片。
xiaohutushen30 2013-04-09
  • 打赏
  • 举报
回复 1
erase(iterator++);这句出来就不明白了,iterator++会先使用iterator去删除元素,但元素删除之后iterator就失效了,他还怎么能自增呢???
xiaohutushen30 2013-04-09
  • 打赏
  • 举报
回复
大家关注一下7楼的问题呀!!现在是7楼那个问题不明白!
黑娃 2013-04-09
  • 打赏
  • 举报
回复
这样理解吧:迭代器是指针,所以你才可以通过迭代器直接修改容器元素,一个指针失效,和他等值的指针当然也失效了。
海的神话 2013-04-09
  • 打赏
  • 举报
回复


Iteratortemp 和Iterator指向同一个元素,删除之后自然都无效了
xiaohutushen30 2013-04-09
  • 打赏
  • 举报
回复
引用 6 楼 yuxiangji 的回复:
我理解是你想在iterator删除之后获取他的下一个元素,其实没必要用一个temp来保存,只需要将erase那句写成erase(iterator++),删除之后iterator自然就指向下一个元素了。
其实本来还明白,但erase(iterator++);这句出来就不明白了,iterator++会先使用iterator去删除元素,但元素删除之后就是小了,他还怎么能自增呢???
newborn2012 2013-04-08
  • 打赏
  • 举报
回复
我理解是你想在iterator删除之后获取他的下一个元素,其实没必要用一个temp来保存,只需要将erase那句写成erase(iterator++),删除之后iterator自然就指向下一个元素了。
楚江课的救赎 2013-04-08
  • 打赏
  • 举报
回复
大神移驾http://bbs.csdn.net/topics/390418553 看看为什么 没有分可怜,给点分吧谢谢有分的大神。
xianitzph9 2013-04-08
  • 打赏
  • 举报
回复
此处为什么Iterator失效后,Iteratortemp也跟着失效了呢? 不要纳闷,你该恍然大悟:------失效这足以说明,map容器搬家了嘛!从而也说明,map erase 操作是要付出很大的代价的!
libralibra 2013-04-08
  • 打赏
  • 举报
回复
所有STL容器类的iterator都只有一个成员变量_Myptr,是指针类型,指向着对应容器里某个元素.复制的时候把指针复制了一下,元素被删除,那个就无效了
oKanXue1 2013-04-08
  • 打赏
  • 举报
回复
是这样的,<<c++primer>>有说
其实你可以先保存的。。
www_adintr_com 2013-04-08
  • 打赏
  • 举报
回复
迭代器只是指向容器里的元素, 不是包含一个容器里的元素. 元素都从容器里删除了, 它所指向的位置自然就失效了.

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧