为了理解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操作相关推荐

  1. Primer c++ 第5版pdf

    下载地址:网盘下载 内容简介  · · · · · · 这本久负盛名的 C++经典教程,时隔八年之久,终迎来史无前例的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的--C++ 大师 Stanle ...

  2. 《C++ Primer 5th》笔记(9 / 19):顺序容器

    文章目录 顺序容器概述 确定使用哪种顺序容器 容器库概览 迭代器 迭代器范围 使用左闭合范围蕴含的编程假定 容器类型成员 begin和end成员 容器定义和初始化 将一个容器初始化为另一个容器的拷贝 ...

  3. C++ primer 第9章 顺序容器

    文章目录 顺序容器类型 确定使用哪种顺序容器 容器库概览 容器操作 迭代器 迭代器支持的所有操作 迭代器支持的所有运算 迭代器范围 对构成范围的迭代器的要求 标准库迭代器范围左闭右开的三种性质 容器定 ...

  4. C++primer十万字笔记 第九章 顺序容器

    顺序容器   容器就是特定类型对象的集合,顺序容器为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应.标准库提供了三种容器类型. 顺序容器概述  标 ...

  5. c++primer学习笔记

    c++ primer 5e学习笔记 第1章 1.标准库 类型和函数的集合,每个c++编译器都必须支持. 2.()运算符:调用运算符.跟随在函数名后,起调用函数的作用 第2章 1.p32:char在一些 ...

  6. 《C++ Primer中文版(第五版)》 第九章 顺序容器

    <C++ Primer中文版(第五版)> 第九章 顺序容器 元素在顺序容器中的顺序与其加入容器时的位置相对应.关联容器中元素的位置由元素相关联的关键字值决定. 所有容器都共享公共的接口,不 ...

  7. C++ Primer中文版(第5版)

    <C++ Primer中文版(第5版) > 基本信息 作者: (美)Stanley B. Lippman(斯坦利 李普曼)    Josee Lajoie(约瑟 拉乔伊)    Barba ...

  8. 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 使 ...

  9. C++中常用的std标准容器(全部容器功能介绍)

    文章目录 C++中常用的std标准容器 顺序容器: 有序关联容器: 无序关联容器: 顺序容器 1. vector容器 a. vector的定义与初始化 b. vecotr常使用的操作 c. 小结: 2 ...

最新文章

  1. ROS创建工作空间与节点
  2. LeetCode-笔记-48.旋转图像
  3. 这家公司向苹果索赔百亿!一场鏖战八年的专利之争仍未结束
  4. react和react2_为什么React16是React开发人员的福气
  5. (pytorch-深度学习系列)ResNet残差网络的理解-学习笔记
  6. ant配置Cesium,纯javascript3d地图类库
  7. python破解压缩包密码(密码字典)
  8. 2021-08-1320210813SONY的专业DSD播放格式(DSF)转WAV的方法
  9. wordpress英文主题怎样汉化成中文网站模板
  10. 在线画图工具ProcessOn
  11. 论文引用:参考文献GB/T 7714、APA、MLA的自动生成
  12. Excel for mac 快速选中大量的数据
  13. 窗内网所有编程类视频大集合
  14. Delphi著名皮肤控件库大全
  15. 重新理了下思路一个人的孤独
  16. c# 屏幕取词的方法
  17. QT QTableWidget的用法
  18. python selenium UI自动化解决验证码的4种方法
  19. MATLAB时间控制函数
  20. Cannot locate the chosen ObjectFactory implementation: spring - [unknown locati

热门文章

  1. 64位ubuntu能安装mysql数据库_Ubuntu操作系统下安装MySQL数据库的方法
  2. egg风格 什么意思_egg框架学习笔记
  3. excel函数调用其他sheet单元格
  4. Nginx页面乱码问题
  5. ajax angular点击事件_Angular的$http的ajax的请求操作(推荐)
  6. wifi安装linux分区,centos7配置wifi驱动
  7. java url压缩_URL短地址压缩算法 微博短地址原理解析 (Java实现)
  8. vs无法启动程序 系统找不到指定文件_进不了系统时要做的事情
  9. 考研数据结构--严版图相关代码 自用
  10. 2019第十届蓝桥杯B组C++省赛E题迷宫--BFS(倒搜)