特殊的forward_list操作
为了理解forward_list为什么有特殊版本的添加和删除操作,考虑当我们从一个单向链表中删除一个元素时会发生什么。当添加或删除一个元素时,删除或添加的元素之前的那个元素的后继会发生变化。为了添加或删除一个元素,我们需要访问其前驱,以便改变前驱改变前驱的链接。但是,forward_list是单向链表。在一个单向链表中,没有简单的方法来获取一个元素的前驱,出于这个原因,在一个forward_list中添加或删除元素的操作是通过改变给定元素之后的元素来完成的。这样,我们总是可以访问到被添加或删除元素所影响的元素。
由于这些操作与其他容器上的操作有实现方式不同,forward_list并未定义insert、emplace和erase,而是定义了名为insert_after、emplace_after和erase_after的操作。为了支持这些操作,forward_list也定义了before_begin,它返回一个首前迭代器。这个迭代器允许我们在链表首元素之前并不存在的元素“之后”添加或删除元素(亦即在链表首元素之前添加删除元素)。
在forward_list中插入或删除元素的操作 |
lst.before_begin() 返回指向链表首元素之前并不存在的元素的迭代器,此迭代器不能解引用。 lst.cbefore_begin() cbefore_begin()返回一个const_iterator lst.insert_after(p,t) 在迭代器p之后的位置插入元素。t是一个对象,n是数量,b和e是表示范围的一对迭代器(b和e不能指向lst内),il是一个花括号列表。返回一个指向最后一个插入lst.insert_after(p,n,t) 元素的迭代器。如果范围为空,则返回p,若p为尾后迭代器,则函数行为未定义。 lst.insert_after(p,b,e) lst.insert_after(p,il) emplace_after(p,args) 使用args在p指定的位置之后创建一个元素,返回一个指向这个新元素的迭代器。若p为尾后迭代器,则函数的行为未定义 lst.erase_after(p) 删除p指向的位置之后的元素,或删除从b之后直到(但不包含)e之间的元素。返回一个指向被删除元素之后元素的迭代器,若不存在这样的元素,则返回尾后迭代 器,如果p指向lst的尾元素或者是一个尾后迭代器,则函数的行为未定义 |
当在forward_list中添加或删除元素时,我们必须关注两个迭代器——一个指向我们要处理的元素,另一个指向其前驱。例如,我们从list中删除奇数元素的循环程序,将其改为从forward_list中删除元素:
forward_list<int> flst={0,1,2,3,4,5,6,7,8,9}; auto prev=flst.before_begin(); //表示flst的“首前元素” auto curr=flst.begin(); //表示flst中的第一个元素 while(curr!=flst.end()) {if(*curr%2)curr=flst.erase_after(prev);// 删除它并移动currelse{prev=curr; //移动迭代器curr,指向下一个元素,prev指向curr之前的元素++curr;} }
此例中,curr表示我们要处理的元素,prev表示curr的前驱。调用begin来初始化curr,这样第一步循环就会检查第一个元素是否是奇数。我们用before_begin来初始化prev,它返回指向curr之前不存在的元素的迭代器。
当找到奇数元素后,我们将prev传递给erase_after,此调用将prev之后的元素删除,即,删除curr指向的元素。然后我们将curr置为erase_after的返回值,使得curr指向序列中下一个元素,prev保持不变,仍指向(新)curr之前的元素。如果curr指向的元素不是奇数,在else中我们将两个迭代器都向前移动。
转载于:https://www.cnblogs.com/wuchanming/p/3915567.html
特殊的forward_list操作相关推荐
- Primer c++ 第5版pdf
下载地址:网盘下载 内容简介 · · · · · · 这本久负盛名的 C++经典教程,时隔八年之久,终迎来史无前例的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的--C++ 大师 Stanle ...
- 《C++ Primer 5th》笔记(9 / 19):顺序容器
文章目录 顺序容器概述 确定使用哪种顺序容器 容器库概览 迭代器 迭代器范围 使用左闭合范围蕴含的编程假定 容器类型成员 begin和end成员 容器定义和初始化 将一个容器初始化为另一个容器的拷贝 ...
- C++ primer 第9章 顺序容器
文章目录 顺序容器类型 确定使用哪种顺序容器 容器库概览 容器操作 迭代器 迭代器支持的所有操作 迭代器支持的所有运算 迭代器范围 对构成范围的迭代器的要求 标准库迭代器范围左闭右开的三种性质 容器定 ...
- C++primer十万字笔记 第九章 顺序容器
顺序容器 容器就是特定类型对象的集合,顺序容器为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应.标准库提供了三种容器类型. 顺序容器概述 标 ...
- c++primer学习笔记
c++ primer 5e学习笔记 第1章 1.标准库 类型和函数的集合,每个c++编译器都必须支持. 2.()运算符:调用运算符.跟随在函数名后,起调用函数的作用 第2章 1.p32:char在一些 ...
- 《C++ Primer中文版(第五版)》 第九章 顺序容器
<C++ Primer中文版(第五版)> 第九章 顺序容器 元素在顺序容器中的顺序与其加入容器时的位置相对应.关联容器中元素的位置由元素相关联的关键字值决定. 所有容器都共享公共的接口,不 ...
- C++ Primer中文版(第5版)
<C++ Primer中文版(第5版) > 基本信息 作者: (美)Stanley B. Lippman(斯坦利 李普曼) Josee Lajoie(约瑟 拉乔伊) Barba ...
- Primer c++第五版笔记2(到第9章完)
目录 Primer c++第五版笔记2(到第9章完) 8 IO库 8.1 IO类 8.1.1 IO对象无拷贝或赋值 8.1.2 条件状态 8.1.3 管理输出缓冲 8.2 文件输入输出 8.2.1 使 ...
- C++中常用的std标准容器(全部容器功能介绍)
文章目录 C++中常用的std标准容器 顺序容器: 有序关联容器: 无序关联容器: 顺序容器 1. vector容器 a. vector的定义与初始化 b. vecotr常使用的操作 c. 小结: 2 ...
最新文章
- ROS创建工作空间与节点
- LeetCode-笔记-48.旋转图像
- 这家公司向苹果索赔百亿!一场鏖战八年的专利之争仍未结束
- react和react2_为什么React16是React开发人员的福气
- (pytorch-深度学习系列)ResNet残差网络的理解-学习笔记
- ant配置Cesium,纯javascript3d地图类库
- python破解压缩包密码(密码字典)
- 2021-08-1320210813SONY的专业DSD播放格式(DSF)转WAV的方法
- wordpress英文主题怎样汉化成中文网站模板
- 在线画图工具ProcessOn
- 论文引用:参考文献GB/T 7714、APA、MLA的自动生成
- Excel for mac 快速选中大量的数据
- 窗内网所有编程类视频大集合
- Delphi著名皮肤控件库大全
- 重新理了下思路一个人的孤独
- c# 屏幕取词的方法
- QT QTableWidget的用法
- python selenium UI自动化解决验证码的4种方法
- MATLAB时间控制函数
- Cannot locate the chosen ObjectFactory implementation: spring - [unknown locati
热门文章
- 64位ubuntu能安装mysql数据库_Ubuntu操作系统下安装MySQL数据库的方法
- egg风格 什么意思_egg框架学习笔记
- excel函数调用其他sheet单元格
- Nginx页面乱码问题
- ajax angular点击事件_Angular的$http的ajax的请求操作(推荐)
- wifi安装linux分区,centos7配置wifi驱动
- java url压缩_URL短地址压缩算法 微博短地址原理解析 (Java实现)
- vs无法启动程序 系统找不到指定文件_进不了系统时要做的事情
- 考研数据结构--严版图相关代码 自用
- 2019第十届蓝桥杯B组C++省赛E题迷宫--BFS(倒搜)