stl循环删除
struct st_data
{
st_data(int i) : id(i) {} int id;
};
对于STL标准序列容器vector/deque/list(以vector为例)
当我们需清空容器vector<st_data*> vec时, 只需简单循环遍历即可
for (auto it = vec.begin(); it != vec.end(); ++it)
{
delete (*it);
*it = nullptr;
}
vec.clear();
但如果想删除所有id%2 == 0的所有元素呢?
首先想到的是:
for (auto it = vec.begin(); it != vec.end(); ++it)
{
st_data *ptr = *it;
if (ptr->id % == )
{
vec.erase(it);
delete ptr;
ptr = nullptr;
}
}
千万不要! 因为当容器的一个元素被删除时, 指向那个元素的所有迭代器也都全部失效了.
正确方法如下:
for (auto it = vec.begin(); it != vec.end();)
{
st_data *ptr = *it;
if (ptr->id % == )
{
it = vec.erase(it);
delete ptr;
ptr = nullptr;
}
else
{
++it;
}
}
注:若为标准关联容器, 则采取不同的策略
对于map<int, st_data*> mpData; 正确使用方法为:
map<int, st_data*> mpData;
for (auto it = mpData.begin(); it != mpData.end();)
{
st_data *ptr = it->second;
if (ptr->id % == )
{
mpData.erase(it++);
}
else
{
++it;
}
}
stl循环删除的更多相关文章
- Java循环删除集合多个元素的正确打开方式
首先说下不正确的打开方式: 第一:使用for循环删除集合的元素,示例代码如下 ArrayList<String> list = new ArrayList<String>(Ar ...
- Python--增量循环删除MySQL表数据
需求场景: 有一业务数据库,使用MySQL 5.5版本,每天会写入大量数据,需要不定期将多表中“指定时期前“的数据进行删除,在SQL SERVER中很容易实现,写几个WHILE循环就搞定,虽然MySQ ...
- STL——遍历 删除 set 元素
==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...
- STL容器删除元素的陷阱
今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...
- oracle 删除用户,表空间;循环删除表
select * from dba_tablespaces 说明:查看所有表空间 ----------------------------------------------------------- ...
- Java中循环删除list中元素的方法总结
印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...
- for循环删除集合陷阱
首先看下面的代码: import java.util.LinkedList;import java.util.List; public class DeleteCollection { ...
- map,vector 等容器内容的循环删除问题(C++)
map,vector 等容器内容的循环删除问题(C++) map,vector等容器的循环删除不能用普通的方法删除: for(auto p=list.begin();p!=list.end();p++ ...
- java集合循环删除
java集合循环删除,java list集合操作,java循环.分享牛,分享牛原创.java集合删除方法. 2.6.1.第一种方式 list.add("1"); list.add( ...
随机推荐
- Effective C++ 34 区分接口继承和实现继承
public继承从根本上讲,有两部分:接口继承和实现继承.两者之前的区别很像函数声明与函数定义. 具体设计中,会呈现三种形式:derived class只继承成员函数的接口(纯虚函数):derived ...
- poj 1239
二次dp,还算好想. 先第一遍dp找出最后一个数字最小是几. dpf[i]=max{j}+1(dpf[j],dpf[j]+1,…,j位组成的数字小于j+1,j+2,…,i位组成的数字. 在第二遍dp, ...
- jquery版小型婚礼(可动态添加祝福语)
前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我的百度生涯,一直寻觅许愿墙背景图片和便利贴图片,觅了好久……一直没找到满意的……无意间看到祝福语和一些卡通婚礼图片.最 ...
- mysql存储过程学习
一.存储过程的创建 语法: CREATE PROCEDURE sp_name (参数)合法的SQL语句 mysql> delimiter // mysql> CREATE PROCEDUR ...
- 检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(转)
我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.N ...
- Gym - 101102C
题目链接 #include <bits/stdc++.h> using namespace std; ; int data[maxn],last[maxn],ans; struct D { ...
- 修改iphone联系人头像
如何通过代码来修改iphone联系人头像 使用如下代码: UIImage *image=[UIImage imageNamed:@"star_full.png"]; NSData ...
- 与你相遇好幸运,Settings
IDE-Java-Setting && IDE-Nodejs-Setting Download
- Java远程方法调用(Remote Method Invocation,RMI)
Java RMI简介: 它是Java的一个核心API和类库,允许一个Java虚拟机上运行的Java程序调用不同虚拟机上运行的对象中的方法,即使这两个虚拟机运行于物理隔离的不同主机上. Java RMI ...
- Redis学习笔记(3) Redis基础类型及命令之二
1. 集合类型 集合类型与列表类型有很多相似之处,但二者的区别在于:前者具有唯一性,但不具有有序性:后者具有有序性,但不具有唯一性.集合类型的常用操作是向集合中加入或删除元素.判断某个元素是否存在等, ...