【C++】关于map的遍历 删除
- int main(int argc, char* argv[])
- {
- map<string, string> mapData;
- mapData["a"] = "aaa";
- mapData["b"] = "bbb";
- mapData["c"] = "ccc";
- for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); i++)
- {
- if (i->first == "b")
- {
- mapData.erase(i);
- }
- }
- return 0;
- }
错误:
i指针在元素被删除后失效了,回到for语句中与mapData.end() 进行比较错误,这个一般都了解。
下面这个是正确删除方法:
- int main(int argc, char* argv[])
- {
- map<string, string> mapData;
- mapData["a"] = "aaa";
- mapData["b"] = "bbb";
- mapData["c"] = "ccc";
- for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)
- {
- if (i->first == "b")
- {
- mapData.erase(i++);
- }
- else
- {
- i++;
- }
- }
- return 0;
- }
这里贴出一个新的错误:
- int main(int argc, char* argv[])
- {
- map<string, string> mapData;
- mapData["a"] = "aaa";
- mapData["b"] = "bbb";
- mapData["c"] = "ccc";
- for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)
- {
- if (i->first == "b")
- {
- mapData.erase(i/*++*/);
- }
- else
- {
- /*i++*/;
- }
- i++;
- }
- return 0;
- }
这同样是另外一个错误。i++操作主要做三件事情:
1、首先把i备份一下。
2、把i加上1。
2、返回第一步备份的i。
mapData.erase(i++);
在执行erase之前,i已经被加1了。erase会使得以前那个未被加一的i失效,而加了一之后的新的i是有效的。
mapData.erase(i); // erase以后 i已经失效,不能再用i++;
i++;
那么erase操作直接让i失效,对失效的i进行加一操作也是失效的。
mapData.erase(i++);
这段代码的真正等效代码是
map<string, string>::iterator iterTemp = i;
++i;
mapData.erase(iterTemp);
【C++】关于map的遍历 删除的更多相关文章
- map/vector遍历删除
map遍历删除 map<int, vector<int>>::iterator it = g_map.begin(); for (; it != g_map.end(); /* ...
- stl map高效遍历删除的方法 [转]
for(:iter!=mapStudent.end():) { if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指 ...
- stl map高效遍历删除的方法
for(:iter!=mapStudent.end():) { if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指 ...
- map循环遍历删除
typedef map<string,int> MapFileList; int main() { MapFileList m_SingleList; m_SingleList.inser ...
- 集合--(List、Set、Map)遍历、删除、比较元素时的小陷阱
6,Map集合遍历的4中方法? 5,List遍历时如何remove元素 4.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下标方式遍历集合,在遍历过程中删除元素,你可能会 ...
- STL容器的遍历删除
STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...
- 对JAVA集合进行遍历删除时务必要用迭代器
java集合遍历删除的方法: 1.当然这种情况也是容易解决,实现方式就是讲遍历与移除操作分离,即在遍历的过程中,将需要移除的数据存放在另外一个集合当中,遍历结束之后,统一移除. 2.使用Iterato ...
- STL中用erase()方法遍历删除元素 .xml
pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...
- map的正确删除方式
遍历删除map元素的正确方式是 for(itor = maptemplate.begin; itor != maptemplate.end(); ) { if(neederase) ...
随机推荐
- OpenCV cvReleaseImage把图像怎么样了?
cvReleaseImage(img)和free.delete相同,只是把该指针img所指的内存给释放掉,但并没有把img指针本身干掉,其地址仍然不变(非NULL),只是该地址对应的内存是垃 ...
- ConnectionString连接字符串-密码丢失的解决方法
今天遇到一个问题,EF,asp.net web端登录成功,退出,再登录就异常了, 登出成功时, EF 中 dbcontext.Database.Connection.ConnectionString ...
- 2018-8-14-Resharper-如何把类里的类移动到其他文件
title author date CreateTime categories Resharper 如何把类里的类移动到其他文件 lindexi 2018-08-14 17:34:39 +0800 2 ...
- TZOJ 4292 Count the Trees(树hash)
描述 A binary tree is a tree data structure in which each node has at most two child nodes, usually di ...
- LA3029 City Game
Bob is a strategy game programming specialist. In his new city building game the gaming environment ...
- js中的观察者模式与发布者/订阅者模式的区别?
- 关于distinct 和group by的去重逻辑浅析
在数据库操作中,我们常常遇到需要将数据去重计数的工作.例如: 表A,列col A C A B C D A B 结果就是一共出现4个不同的字母A.B.C.D 即结果为4 大体上我们可以选择count(d ...
- 使用setTimeout函数解决栈溢出问题
下面的代码,如果队列太长会导致栈溢出,怎样解决这个问题并且依然保持循环部分: var list = readHugeList(); var nextListItem = function() { va ...
- php 该如何获取从百度搜索进入网站的关键词
清源分享一个php获取从百度搜索进入网站的关键词的代码,有需要的朋友可以参考一下:https://blog.csdn.net/u012275531/article/details/17609065 代 ...
- Java review-basic4
1. HashMap vs HashTable vs ConcurrentHashMap 1). Thread -Safe : ConcurrentHashMap is thread-safe tha ...