c++ 遍历map时删除当前元素正确方法

c++ 遍历map时删除当前元素正确方法,第1张

如果是清空map的话建议用mp.clear()。

你的代码貌似是没有错的啊,用了dev-c++运行没有问题

这里是我的代码,运行无问题,与你的代码应该是一样的

for(map<int,int>::iterator it=mp.begin()it!=mp.end())

mp.erase(it++)

是不是其它的语句影响的呢?

或者改为这个试试

for(map<int,int>::iterator it=mp.begin(),nextit!=mp.end())

{

next=it

next++

mp.erase(it)

it=next

}

根据你的问题,我觉得它和下面的问题是等价的:

std::map<T1,T2>模板类,clear成员函数的作用是什么,以及如何影响其控制的内存

下面我来讲讲这一点:

std::map<T1 key,T2 value>::clear()成员函数本身的作用是将map所有的节点都释放,执行完成之后map成为一个空映射表

由于map会释放节点,所以如果节点是对象,而非指针的时候,clear会调用对象的析构函数

在这种情况下,map会释放相关内存的占用

但是如果节点是指针而非对象的时候,情况就比较复杂,因为clear不会主动进行释放指针指向的内存。这个时候需要用户在清理map的时候进行处理

如果指针是指向的常量地址(比如常量字符串、常量数组之类),则可以无需释放

如果指针是指向的对象地址,而这个对象本身是全局对象或者另有程序控制它的生命周期,则也可以无需释放

对于上面两种情况,map的clear可以直接调用无需特别的自定义处理

但是对于指针是通过new、malloc、alloc等方式获取的,而且仅有map获取了持有权,则需要在清理的时候,遍历所有的节点,执行内存释放后,再调用clear

补充几点:

std::map<T1,T2>::iteator 可以像std::list<T>::iteator一样,遍历map的所有节点

作为map的key,请不要使用指针,因为map会将指针作为类似整数一样的处理,而不会调用相关的比较 *** 作,另外key被清理的时候,情况和value一样,参考上面的描述

map并非线程安全的,这点尤其注意 stl并没有对map的线程安全性做任何承诺


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9899581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存