【C++进阶(四)】STL大法--list深度剖析list迭代器问题探讨

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习C++
  🔝🔝


在这里插入图片描述

链表list

  • 1. 前言
  • 2. list的使用
    • 2.1 list的构造函数
    • 2.2 list迭代器的使用
    • 2.3 list容量相关操作
    • 2.4 list的增删查改
  • 3. list迭代器失效问题探讨
  • 4. 算法库函数和list的关系
    • 4.1 算法库函数的迭代器类型
    • 4.2 list不能使用的算法库函数
  • 5. 总结以及拓展

1. 前言

本质重点:

本章重点讲解list的接口函数的熟悉
并且讲解list迭代器失效的特性
最后讲解迭代器的功能分类以及
算法库函数中谁能用谁不能用

STL标准库中的list是一个
带头双向循环链表

和vector不同,list没有支持[ ]访问
以及resize和reserve容量相关的函数

这是因为list不能随机访问数据

并且list的迭代器的底层明显不是指针了
那它的底层到底是啥?
list会和vector一样有迭代器失效问题吗?

带着这些疑问,我们来进入今天的学习分享


2. list的使用

我们还是在网站:cplusplus中查询字典

在这里插入图片描述

和vector一样,list也有两个模板参数
但是第二个模板参数是和内存效率相关的
所以现在的学习暂时不用管它(它有缺省值)

list的使用分为以下几个阶段进行:

  • list的构造,析构,拷贝构造函数
  • list迭代器的使用
  • list容量相关的操作
  • list的增删查改

2.1 list的构造函数

list的构造函数:

在这里插入图片描述

第一个是无参构造,直接跳过
第二个是用n个val初始化list对象
第三个是用一段迭代器区间构造
第四个是用一个初始值构造

看起来平平无奇,来实操一下:

list<int> l1;//无参构造
list<int> l2(10,5);//用10个5初始化链表vector<int> vv{1,2,3,4,5,6};
list<int> l3(vv.begin(),vv.end());//用迭代器区间初始化list<char> l4('a');//用一个字符来初始化

list的拷贝构造和析构函数在使用
list时不会显示调用,所以将它们忽略掉


2.2 list迭代器的使用

虽然list的迭代器底层不是指针
但是可以把它理解为指针来使用

在这里插入图片描述
这四个函数都是老朋友了,不多介绍了

唯一值得注意的是下图:
在这里插入图片描述
begin和rend的指向相同
end和rbegin的指向相同

迭代器遍历链表:

vector<int> vv{1,3,5,7,9,11,13,15};
list<int> l(vv.begin(),vv.end());auto it = l.begin();
while(it!=l.end())
{cout << *it<< " ";it++;
}

范围for遍历链表:

vector<int> vv{1,3,5,7,9,11,13,15};
list<int> l(vv.begin(),vv.end());
for(auto x : l)
{cout << x<< " ";
}

注:list不支持随机访问,不能用[]

一个小tips:

在写用迭代器遍历容器时,我们往往
会写it!=l.end(),而不是it<l.end()
这是因为在list中,空间并不连续,用小于
符号很大概率会出错,但是在string
和vector中,空间是连续的,用<也没问题


2.3 list容量相关操作

这里最简单,和vector一模一样

在这里插入图片描述
在这里插入图片描述
只有这四个函数接口比较常用!


2.4 list的增删查改

首先映入眼帘的头插/头删,尾插/尾删

在这里插入图片描述

这几个函数的意思很明了,直接跳过

insert插入:

在这里插入图片描述

insert函数要输入一个迭代去位置进行插入
可以插入一个数据或插入一段迭代器区间

erase删除:

在这里插入图片描述
erase函数可以删除一个迭代器的数据
或者删除一段迭代器区间

clear清空有效元素:

在这里插入图片描述

list不像vector一样有size和capacity
list的clear函数是将链表清空
(除头节点外)

增删查改实操:

vector<int> vv{1,5,10,15,20,100,120};
list<int> ll(vv.begin(),vv.end());
auto pos = find(ll.begin(),ll.end(),20);
ll.insert(pos,250);
ll.erase(ll.begin()+2);
ll.clear();

3. list迭代器失效问题探讨

由于list的底层是双向带头循环链表
所以插入操作时,pos指向的节点的
位置始终都是一个位置,它们只改变
链接关系,并不连续,所以插入操作
并不会导致list迭代器失效

list迭代器失效只在erase删除时才会发生
erase删除的位置在空间上是唯一的
这个位置的数据被删除后,只是改变了
数据的链接关系,然而此位置已经不在
原先的链表中了,再次使用会出错!

STL库的erase提供了返回值来解决问题:

在这里插入图片描述
在这里插入图片描述
会返回被删除位置的下一个位置的迭代器
以后可以这样写代码来避免错误:

list<int> ll{1,2,3,4,5,6,7,8};
auto it=ll.begin();
while(it!=ll.end())
{if((*it)%2==0){it=erase(it);}else{it++;}
}

4. 算法库函数和list的关系

首先,迭代器从功能角度可以分类为:

  1. 正向迭代器: forward_iterator
  2. 双向迭代器: bidirectional_iterator
  3. 随机迭代器: random_iterator

它们分别支持且仅支持:

  1. 只支持++
  2. 支持++和- -
  3. 支持++,- -,+和-

常见的容器以及它们的迭代器类型:

容器迭代器功能
vector随机迭代器
list双向迭代器
stack不支持迭代器
queue不支持迭代器
deque随机迭代器
set / multiset双向迭代器
map / multimap双向迭代器
priority_queue不支持迭代器

4.1 算法库函数的迭代器类型

现在再来看算法库的sort函数:

在这里插入图片描述

它的函数模板支持的是随机迭代器

再来看看算法库的reverse函数:

在这里插入图片描述

它的函数模板支持的是双向迭代器

我先给出以下的结论:

  1. 若函数模板给的随机迭代器
    则只能传有随机迭代器的容器

  2. 若函数模板给的双向迭代器
    则可以传有随机或者双向迭代器的容器

  3. 若函数模板给的单向迭代器
    则三种迭代器都可以传进来!

可以看出它支持向上兼容!


4.2 list不能使用的算法库函数

可见,list是双向迭代器,而sort函数的
函数模板是随机迭代器
所以库函数中的sort无法排序链表

但是仔细查阅字典可以发现:
list类自己实现了一个不同于算法库的排序

在这里插入图片描述

此排序专门用于排序list中的数据!

虽然list有自己的sort函数来排序
但是当数据很多时,list自我实现的
sort的效率低的惊人!甚至还不如
将list的数据导入vector容器
再在vector容器中使用算法库的排序
排完序再导入到list中,这一步骤快!


5. 总结以及拓展

总的来说list的使用和vector大同小异
当然,要掌握list,list的模拟实现是不可少的
list的模拟实现将在下一节分享给大家

本章笔记:

  1. 请自行熟悉list接口函数

  2. list的insert不会导致迭代器失效
    而erase会致使迭代器失效

  3. 迭代器从功能上可以划分为三种
    它们向上兼容彼此

  4. list不能使用算法库中的sort
    但list类中实现了专门排序链表的函数

拓展阅读:

迭代器相关拓展知识


🔎 下期预告:list的模拟实现以及对比vector的区别 🔍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/97854.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xcode 清空最近打开的项目

打开Xcode任意项目 File -> Open Recent -> Clear Menu

MYSQL调优之思路----sql语句和索引调优

MySQL数据库性能优化包括综合多方面因素&#xff0c;应根据实际的业务情况制定科学、合理的调优方案进行测试调优 文章目录 MySQL性能优化1 优化介绍1.2 优化要考虑的问题2.1 优化可能带来的问题2.2 优化的需求2.3 优化由谁参与2.4 优化的方向2.5 优化的维度 1.2数据库使用优化…

滑动窗口实例4(将x减到0的最小操作数)

题目&#xff1a; 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &#xff0c;返回 …

伯俊ERP与金蝶云星空对接集成表头表体组合查询连通分布式调出单新增(调拨出库对接分布式调出(KD调拨)6月)

伯俊ERP与金蝶云星空对接集成表头表体组合查询连通分布式调出单新增(调拨出库对接分布式调出&#xff08;KD调拨&#xff09;6月) 对接系统&#xff1a;伯俊ERP 伯俊科技&#xff0c;依托在企业信息化建设方面的领先技术与实践积累&#xff0c;致力于帮助企业实现全渠道一盘货。…

WordPress Page Builder KingComposer 2.9.6 Open Redirection

WordPress Page Builder KingComposer 2.9.6 Open Redirection WordPress 插件 KingComposer 版本2.9.6 以及以前版本受到开放重定向漏洞的影响。该漏洞在packetstorm网站披露于2023年7月24日&#xff0c;除了该漏洞&#xff0c;该版本的插件还存在XSS攻击的漏洞风险 图1.来自…

【设备树笔记整理7】实践操作

1 使用设备树给DM9000网卡_触摸屏指定中断 1.1 修改方法 根据设备节点的compatible属性&#xff0c;在驱动程序中构造/注册 platform_driver&#xff0c;在 platform_driver 的 probe 函数中获得中断资源。 1.2 实验方法 以下是修改好的代码&#xff1a;第6课第1节_网卡_触摸…

30岁了,说几句大实话

是的&#xff0c;我 30 岁了&#xff0c;还是周岁。 就在这上个月末&#xff0c;我度过了自己 30 岁的生日。 都说三十而立&#xff0c;要对自己有一个正确的认识&#xff0c;明确自己以后想做什么&#xff0c;能做什么。 想想时间&#xff0c;过得真快。 过五关斩六将&…

RK开发板的USB连接(Ubuntu)

一、安装连接工具 sudo apt-get install putty 二、启动putty工具 sudo putty 三、连接usb&#xff0c;并查看相关的信息 # 查看接入的是否有usb ls /dev/tty* 显示如下&#xff1a;&#xff08;含有usb接口&#xff1a; /dev/ttyUSB0&#xff09; /dev/tty /dev/tty23 /d…

go语言基础语法

1、注释 package mainimport "fmt"/* *多行注释*/ func main() {//单行注释fmt.Println("hello world") }2、变量 2.1、变量定义 标准格式 var 变量名 变量类型 如 var age int Go语言的基本类型有&#xff1a; boolstringint、int8、int16、int32、…

MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具

MybatisPlus 快速入门 常见注解 配置_软工菜鸡的博客-CSDN博客 2.核心功能 刚才的案例中都是以id为条件的简单CRUD&#xff0c;一些复杂条件的SQL语句就要用到一些更高级的功能了。 2.1.条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此…

qt day5 数据库,tcp

数据库 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase>//数据库管理类 #include <QSqlRecord>//记录类 #include <QSqlQuery>//执行sql语句对应的类 #include <QMessageBox> #include<QDebug> …

K8S:二进制部署K8S(两台master+负载均衡nginx+keepalived)

文章目录 一.常见的K8S部署方式1.Minikube2.Kubeadmin3.二进制安装部署 二.二进制搭建K8S(双台master)1.部署架构规划2.系统初始化配置3.部署 docker引擎4.部署 etcd 集群&#xff08;1&#xff09;etcd简介&#xff08;2&#xff09;准备签发证书环境&#xff08;3&#xff09…