在遍历STL容器类对象时进行插入和删除操作本身即是不合理的。。。再想想,待续。。。

STL容器迭代过程中删除元素技巧(转)

 

1.连续内存序列容器(vector,string,deque)

序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素。

vector<int> c;
for(vector<int>::iterator it = c.begin(); it != c.end();)
{
if(need_delete())
  it = c.erase(it);
 else
  ++it; 
}

2.关联容器(set,multiset,map,multimap)

关联容器的erase方法没有返回值,被删除的迭代器失效,所以删除前必须确保能得到下一个迭代器,可以用“后置递增迭代器”技术。

map<int,int> m;
for(map<int,int>::iterator it = m.begin(); it != m.end();)
{
 if(need_delete()) 
  m.erase(it++);
 else
  ++it;
}

m.erase得到it的一个副本,在erase真正开始之前it已经递增了。

所以erase得到了当前的迭代器,在erase内部工作开始之前it已经++了,正好满足我们的需要。

3.非连续内存序列容器(list)

只所以单独列出来是因为以上两种方法对list都适用,可依自己喜好选择。

最新文章

  1. [LeetCode] Flatten Binary Tree to Linked List 将二叉树展开成链表
  2. python getopt使用
  3. Eclipse之Git提交项目
  4. the server responded with a status of 404 (Not Found)
  5. 随笔001:Group by 语法剪辑
  6. tmux复制到windows剪贴板/粘贴板的坑
  7. FileUtils.copyDirectory without .SVN
  8. 一个IIS网站的异常配置的安全解决方案
  9. 读书笔记 effctive c++ Item 20 优先使用按const-引用传递(by-reference-to-const)而不是按值传递(by value)
  10. js中的sort方法
  11. PXE+kickstart网络安装CentOS7.4系统及过程中各种报错
  12. webpack的四大核心概念
  13. 【洛谷2015】【CJOJ1976】二叉苹果树
  14. Butterknife--Android Butterknife使用方法总结(转)
  15. 数据库导入导出expdp,impdp
  16. 逻辑回归应用之Kaggle泰坦尼克之灾
  17. php 中更简洁的三元运算符 ?:
  18. 通过Windows PowerShell远程管理计算机(精简版)
  19. ajax等待(比较慢时)(显示图片)
  20. STS IDE 个性化修改

热门文章

  1. webrtc doubango linphone
  2. 机器学习:SVM(非线性数据分类:SVM中使用多项式特征和核函数SVC)
  3. Python运行错误解释
  4. L2-023. 图着色问题(暴力)
  5. 深入理解Java虚拟机—JVM内存结构
  6. VC用Beep整几首歌听听~~~
  7. 第十章 深入理解Session与Cookie
  8. JavaScript语言基础-对象与数组
  9. XSS过滤器的实现
  10. 【263】Linux 添加环境变量 &amp; 全局 shell 脚本