安全删除STL容器元素
2015-08-11 21:57
330 查看
STL容器迭代过程中删除元素技巧(转)
vector<int> c;
for(vector<int>::iterator it = c.begin(); it != c.end();)
{
if(need_delete())
it = c.erase(it);
else
++it;
}
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已经++了,正好满足我们的需要。
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都适用,可依自己喜好选择。相关文章推荐
- request.getParameterValues与request.getParameter的区别
- TypeError:e is undefined
- request.getParameterValues与request.getParameter的区别
- (转)JAVA的整型与字符串相互转换
- MySQL 数据库ut8mb4字符集
- iOS-Core Animation 核心动画
- linux之sed用法
- hdu 1010 Tempter of the Bone(搜索+奇偶剪枝)
- 火星菌
- 简单的心搏函数
- HDU - 1232 - 畅通工程
- Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
- 机器学习之实战matlab神经网络工具箱
- ArrayList中的toArray()
- 2015第33周二
- [2015hdu多校联赛补题]hdu5371 Hotaru's problem
- Matlab tips and tricks
- 5步轻松搞定windows系统下mysql命令行操作,完成简单mysql配置
- 基于Ofbiz的ERP Opentaps 1.5 安装
- HDU5375