STL : List使用时应注意的问题
这篇文章所述只是本人遇到的问题,仅供参考。
#include<list>
#include<iostream> using namespace std; class Foo
{
public:
Foo(int i) {m_iData = i;}
void setData(int i ) {m_iData = i;}
int GetData() {return m_iData;}
private:
int m_iData;
};
// 为了提高可读性,定义容器和迭代器的名字
typedef list<Foo*> FooList;
typedef FooList::iterator FooListItor; void main()
{
FooList c; // 创建一个链表容器 //将三个不同的元素填入链表中
c.push_back(new Foo());
c.push_back(new Foo());
c.push_back(new Foo());
//迭代遍历链表
for(FooListItor itor = c.begin();itor != c.end();)
{
if((*itor)->GetData() == )
{
delete (*itor);
itor = c.erase(itor);
}
else
++itor;
} //确保所有的对象被删除,链表不会自动完成该项任务
for(FooListItor itor2 = c.begin(); itor2 != end();++itor2)
delete (*itor2);
}
使用指针指向动态分配内存的结构或对象时,有几件事情需要注意。
1. 你要负责在使用完对象后释放所有分配的内存。容器并不知道将使用何种类型,所以它们不可能帮你自动释放内存。
2. 许多运算可能会失败,这是因为它们直接对对象或结构的指针进行操作,而不是对对象或结构本身。比如链表的sort()函数,它使用<运算符来比较值并以此结果进行排序。就算运算符对类Foo是合法的,但链表的排序仍是按照指针的实际值而不是对象中数据的值。因而有必要设计自己的比较运算符,在比较之前先对指针解引用。
3.记住,复制容器时,复制的仅仅是指针而不是对象。如果产生了重复的指针,将极难确定哪一个对象需要删除。解决办法是使用智能指针(smart pointer),或避开容器间复制元素的STL的例程或算法。
4.注意,在迭代遍历链表的时候,从链表中删除元素要非常小心。因为删除当前指向的元素将导致迭代器失效,所以你必须确保正确使用erase()函数的返回值,它是这个函数将检索出的容器中的下一个合法位置,通过将这个返回值分配给老的迭代器,我们就跳过了非法位置。但是这又给我们带来了新的问题。当for循环在循环结束处试图对迭代器递增,由于我们已经用erase()将迭代器递增到了下一个位置,因此就会出现问题。为了解决这个问题,我们将递增运算从for循环体移到了循环中的条件选择语句内,在元素没有删除时才进行递增。(一般来说,最好使用算法从容器中删除元素,而不是手工迭代来做,如算法remove_if()就能安全有效地进行该项操作)。
STL : List使用时应注意的问题的更多相关文章
- Promise使用时应注意的问题
最近在使用axios库时遇到了个问题,后端接口报了500错误,但前端并未捕获到.1. 调用接口的业务代码如下: // 业务代码调用 axios({ url: url, method: 'post', ...
- C++基础之引用与指针的区别与联系、常引用使用时应注意的问题
什么是引用? 引用就是对变量起一个别名,而变量还是原来的变量,并没有重新定义一个变量.例如下面的例子: #include<iostream> using namespace std; ...
- 【纯干货】SVN使用时应注意的那些事
一.SVN使用步骤 检出 checkout 更新 update 冲突 confilicte 添加 Add (没有添加项目可不写) 填写svn日志 提交 commit你以为到这儿就结束了吗?....NO ...
- Toolbar 和 CollapsingToolbarLayout一起使用时menu item无点击反应解决办法
昨天一直在琢磨为什么Toolbar和CollapsingToolbarLayout一起使用时menu item无点击放应的原因,后来在stackoverflow上一条回答,说可能是Toolbar的背景 ...
- 【WPF】当 ItemsSource 正在使用时操作无效。改用 ItemsControl.ItemsSource 访问和修改元素
问题: 中文版报错:Additional information: 当 ItemsSource 正在使用时操作无效.改用 ItemsControl.ItemsSource 访问和修改元素. 英文版报错 ...
- Cookie使用时需要注意个数及大小限制
各浏览器对Cookie有一定的限制,在使用时需要格外注意. 各浏览器之间对cookie的不同限制: IE6.0 IE7.0/8.0/9.0+ Opera FF Safari Chrome cook ...
- EntityFrameWork 使用时碰到的小问题
EntityFrameWork 使用时碰到的小问题 1,在使用orm访问数据库的相目里,也要引用EntityFrameWork.dll,否则无法使用orm 否则,编译错误 错误 5 "Sys ...
- MySQL 安装和启动服务,“本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。”
MySQL 安装和启动服务,以及遇到的问题 MySQL版本: mysql-5.7.13-winx64.zip (免安装,解压放到程序文件夹即可,比如 C:\Program Files\mysql-5. ...
- MaterialCalendarView使用时遇到的问题
一.概述 MaterialCalendarView是一个开源项目.功能强大支持多选.单选.标注等. 二.问题 1.其继承自ViewGroup,故与CalendarView半毛钱关系都没有,完全是一个新 ...
随机推荐
- BZOJ1131 POI2008 Sta 【树形DP】
BZOJ1131 POI2008 Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=10 ...
- BZOJ1059 ZJOI2007 矩阵游戏 【二分图匹配】
BZOJ1059 ZJOI2007 矩阵游戏 Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一 ...
- python模块--time模块
1.时间戳 import time #------->> 时间戳 print(time.time()) 1525418832.2835853 2.结构化时间 #------->> ...
- elixir 调用erlang 代码
备注: 项目比较简单,主要是elixir 混合erlang 代码,elixir 调用erlang 模块方法 1. 初始化项目 mix new erlangelixirdemo 项目结构如 ...
- arangodb 安装简单试用
备注: 测试环境使用的是docker 1. 安装 docker run -p 8529:8529 -e ARANGO_ROOT_PASSWORD=openSesame arangodb/aran ...
- 转发 Java火焰图在Netflix的实践
为了分析不同软件或软件的不同版本使用CPU的情况,相关设计人员通常需要进行函数的堆栈性能分析.相比于定期采样获得数据的方式,利用定时中断来收集程序运行时的PC寄存器值.函数地址以及整个堆栈轨迹更加高效 ...
- Terraform 多云管理工具
1. 介绍 Terraform is a tool for building, changing, and versioning infrastructure safely and efficie ...
- 【转】MFC对话框和控件
原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主 ...
- 什么是spark(二) RDD
其实你会发现很多概念都是基于RDD提出来的,比如分区,缓存这些操作的对象其实都是RDD:所以不要讲spark的分区,这其实很不专业,分区其实是属于RDD的概念(只有pair RDD才有分区概念) RD ...
- elipse中开发servlet,直接run as 时出现404错误的解决方法
在elipse中开发servlet时,无论在IDE中运行,还是在浏览器中访问servlet时,一直报404错误, 后发现在build目录中没有生成相应的类文件,后反复采用project中的clean. ...