【C++STL详解(五)】--------list的介绍与使用

目录

前言

一、list的介绍

二、list的使用

Ⅰ.默认成员函数

1、构造函数

2、赋值重载

3、析构函数

Ⅱ、容量

1.size()

Ⅲ、迭代器与遍历

1.begin+end (正向迭代器)

2.rbegin+rend (反向迭代器)

3.front

4.back

Ⅳ、增删查改

1.push_front

2.pop_front

3.push_back

4.pop_back

5.insert

6.erase

7.swap

8.clear()

三、细节问题-迭代器失效


前言

前面在数据结构中我们已经了解到,单链表,带头双向循环链表,那么好!C++中的容器也存在这一些链表,下面来了解了解list,以及它常用的接口,完整文档可看list文档!(PC端打开哦!)使用时一定要记得包对应容器的头文件哦!

一、list的介绍

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
2. list底层是带头双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素
3. listforward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
4. 与其他的序列式容器相比(arrayvectordeque)list通常在任意位置进行插入、移除元素的执行效率更好。
5.与其他序列式容器相比,listforward_list最大的缺陷是不支持任意位置的随机访问!要访问某一位置,需要从已知位置开始遍历到该位置,时间上存在一笔大的开销!

二、list的使用

注意:list 中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list 中一些 常见的重要接口

Ⅰ.默认成员函数

1、构造函数

和前面的vector类似,常见的就四个:

list();    //无参构造
list(size_type n, const value_type& val = value_type());  //构造并初始化n个val
list (const list& x);//拷贝构造
list (InputIterator first, InputIterator last);//迭代器区间构造

具体使用:

list<int> l1;//无参list<int> l2(10, 1);//初始化元素为10个1list<int> l3(l2);//将l2的内容拷贝给l3,并初始化l3list<int> l4(l2.begin(), l2.begin() + 5);//迭代器区间构造

2、赋值重载

list& operator= (const list& x);//使用
list<int> l2(10, 1);//初始化元素为10个1list<int> l5=l2;//赋值

3、析构函数

~list();

这个也是使用自带的即可,实践在底层实现时还是要自己写,因为在底层涉及到空间的申请,需要手动释放!现在使用的容器是直接封装好的,给用户带来我们带来良好的体验!

Ⅱ、容量

1.size()

//原型,获取数据个数
size_type size() const;//使用
list<int> l2(10,1);
cout << l2.size();

2.empty()

l2.empty();//判空

你没看错,这里的list常用就这两个,库里面还有一个叫max_size(),但用得不多!

Ⅲ、迭代器与遍历

1.begin+end (正向迭代器)

begin():返回第一个元素的迭代器

 iterator begin(); 
 const_iterator begin() const;//为const对象提供的

end():返回最后一个元素下一个位置的迭代器

iterator end();

const_iterator end() const;

看代码:

值得注意的是:list的begin和end,不能像vector那样直接begin()+5,而是只能++,实际上是因为底层结构的原因,vector底层是个连续的空间,而list不是!

2.rbegin+rend (反向迭代器)

rbegin():返回第一个元素的reverse_iterator(反向迭代器),即end位置

 reverse_iterator rbegin(); 
 const_reverse_iterator rbegin() const;//为const对象提供的

rend():返回最后一个元素下一个位置的 reverse_iterator,即begin位置

 reverse_iterator rend(); 
 const_reverse_iterator rend() const;

看代码:

还是要注意反向迭代器是反向++,向前走!

3.front

front:返回list的第一个节点中值的引用

reference front();

const_reference front() const;


4.back

back:返回list的最后一个节点中值的引用

reference back);

const_reference back() const;

Ⅳ、增删查改

1.push_front

头插操作。

    void push_front(const value_type & val);

使用范围for遍历是因为有迭代器的存在,这一点不过多赘婿!

2.pop_front

头删操作。

    void pop_front();

3.push_back

尾插操作。

    void push_back(const value_type & val);

4.pop_back

尾删操作。

void pop_back();

5.insert

插入操作:在pos位置前插入一个值,同样需要结合算法库里的find函数去使用!

①特定位置前插入一个值

②特定位置前插入n个val

③在特定位置前插入一段迭代区间(左闭右开)

6.erase

删除操作:删除特定位置或者区间的值!并且返回一个迭代器,这个迭代器指向被删除元素的后一个元素的位置

iterator erase(iterator position);
iterator erase(iterator first, iterator last);

来吧,展示!同样也需要配合find()使用

①删除特定位置的值

②删除特定区间的值(左闭右开)

一定要注意这里是传进去两个迭代器,并且是左闭右开区间,这里写法上和vector一定要注意区分,原因还是因为底层结构的不同!!!

7.swap

主要是交换两个list中的元素 !这个是list内部的成员函数,不是那个算法库里面的全局的swap

    void swap(list & x);

8.clear()

clear:清空 list 中的有效元素

 void clear();

三、细节问题-迭代器失效

这个问题也在vector中涉及,但是对于list而言,它的insert不会存在迭代器失效的问题,因为他并没有引起底层空间的变化!那么它是在哪里会失效呢?就是在删除操作上list迭代器会失效。

原因:

因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代 器失效的,只有在删除时才会失效,并且 失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响
看代码:
解决方案还是一样:如果还是要使用就更新;
这里能这样写是因为erase它是由返回值的, 返回一个迭代器,这个迭代器指向被删除元素的后一个元素的位置

今天的分享就到这里!感谢你的观看与指导!

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

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

相关文章

vue3 + ts 快速入门(全)

文章目录 学习链接1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue …

CUDA共享内存

GPU中有两种类型的内存&#xff1a; 板载内存片上内存 全局内存是较大的板载内存&#xff0c;延迟相对较高&#xff1b;共享内存是较小的片上内存&#xff0c;具有相对较低的延迟。共享内存的常用用途&#xff1a; 块内线程的通信通道全局内存数据的可编程管理缓存高速暂存存…

设备能源数据采集新篇章

在当今这个信息化、智能化的时代&#xff0c;设备能源数据的采集已经成为企业高效运营、绿色发展的重要基石。而今天&#xff0c;我们要向大家介绍的就是一款颠覆传统、引领未来的设备能源数据采集神器——HiWoo Box网关&#xff01; 一、HiWoo Box网关&#xff1a;一站式解决…

confluence 设置https代理

使用nginx反待confluence并开启https后&#xff0c;登录confluence会一直提示&#xff1a;scheme、proxyName、proxyPort设置错误。 解决办法&#xff1a; find / -name server.xmlvi /opt/atlassian/confluence/conf/server.xml HTTP反代配置 HTTPS反代配置

jvm垃圾回收机制介绍

JVM&#xff08;Java虚拟机&#xff09;是Java程序的运行环境&#xff0c;它负责执行字节码文件。JVM的工作原理主要包括以下几个部分&#xff1a;类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码&#xff0c;执行引擎负…

SQL数据库

一.什么是数据库 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储。&#xff08;database 简称DB&#xff09; 数据库管理系统&#xff1a;管理数据库的大型软禁&#xff08;DataBase Management System 简称DBMS&#xff09; SQL&#xff1a;操作关系…

微信开发api、微信视频号开发

接口地址&#xff1a; http://api.videostui.com/finder/v2/api/login/checkLogin 接口说明 获取到登录二维码后需每间隔5s调用本接口来判断是否登录成功新设备登录平台&#xff0c;次日凌晨会掉线一次&#xff0c;重新登录时需调用获取二维码且传appId取码&#xff0c;登录成…

莫比乌斯变换的数学原理

关键词&#xff1a;Mobius Transformations 一、说明 关于莫比乌斯变换&#xff0c;是一个代数几何变换的重要概念。也是双曲几何的重要理论&#xff0c;比如庞加莱盘就是建立在这个理论上&#xff0c;那么这个变换到底有哪些内容&#xff1f;本文将做出详细的解读。 二、线…

使用量排名前50的GPTs趋势和特征

Chatgpt的gpt商店已经有几千gpts了。目前哪些gpts比较受欢迎呢&#xff1f;有哪些趋势和投资呢? 根据whatplugin.ai&#xff08;截止日期为2024年3月&#xff09;&#xff0c;使用量最多的50个gpts数据分析结果如下&#xff1a; GPTs类型的分布情况如下&#xff1a; 图像生成…

FreeRTOS任务通知

FreeRTOS任务通知 FreeRTOS 新增了任务通知(Task Notifictions)这个功能&#xff0c;可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高&#xff0c;任务通知在 FreeRTOS 中是一个可选的功能&#xff0c; 使用队列、信号量、事件标志…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;不仅改变了人们之间的社交方式&#xff0c;也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点&#xff0c;以及它如何塑造和改变…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

2-手工sql注入(进阶篇) sqlilabs靶场1-4题

1. 阅读&#xff0c;学习本章前&#xff0c;可以先去看看基础篇&#xff1a;1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战&#xff0c;关于sqlilabs靶场的搭建&#xff1a;Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap&#xff0c;关于sqlmap的命令&…

stm32f103zet6_串口实现-DHT11-tim1(定时)

1思路 1打开时钟 1.1使用定时器实现us级的计时 1.2在打开串口 1,3在DHT11驱动中修改引脚 stm32cudeMX 配置 1打开时钟 2打开串口 3打开tim1(定时器) 4生成代码 代码设置 1导入DHT11库(tim.h是定时器的文件系统自动生成的) DHT11.c #include "dht11.h" #inc…

PHP算命源码_最新测算塔罗源码_可以运营

功能介绍 八字精批、事业财运、姓名分析、宝宝起名、公司测名、姓名配对、综合详批、姻缘测算、牛年感情、PC版测算、八字合婚、紫微斗数、鼠年运程、月老姻缘、许愿祈福、号码解析、塔罗运势、脱单占卜、感情继续、脱单占卜、塔罗爱情、心理有你、能否复合、暗恋对象、是否分…

5.3 进程间通信管道和共享内存

每次打开一个网页都是一个进程 进行管道之间通信的方式&#xff1a;以前学到的有可以在磁盘上开辟空间进行交互&#xff0c;也可以在内存中开辟缓冲区进行交互。 一定注意可读性 管道就是属于在内存中的一片缓冲区&#xff0c;管道可以在命令行中创建管道mkfifo也可以在vim中…

java技术栈快速复习05_基础运维(linux,git)

Linux知识总览 linux可以简单的理解成和window一样的操作系统。 Linux和Windows区别 Linux是严格区分大小写的&#xff1b;Linux中一切皆是文件&#xff1b;Linux中文件是没有后缀的&#xff0c;但是他有一些约定俗成的后缀&#xff1b;Windows下的软件一般是无法直接运行的Li…

京东JD商品SKU信息API返回值解析:精准掌握商品属性

在电子商务迅猛发展的今天&#xff0c;商家对于商品信息的掌握和管理显得尤为重要。作为电商平台的佼佼者&#xff0c;京东&#xff08;JD&#xff09;提供了丰富的API接口&#xff0c;使得商家能够轻松地获取商品的详细信息&#xff0c;包括SKU&#xff08;Stock Keeping Unit…

2024五一数学建模A题思路代码与论文分析

2024五一数学建模A题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upvkv6nx?singleDoc# 2024五一数学建模A题钢板最优切割路径问题需要建立的模型和算法: 图论 最短路径算法(Dijkstra算法、Floyd算法等) 动态规划 网格化离散建模 …

【USB 3.2 Type-C】 端口实施挑战的集成解决方案 (补充一)

USB 3.2 Type-C 端口集成 补充&#xff0c;上一篇感觉还有没理解到位的一部分&#xff1b; 一、只做正反插的通信&#xff0c;已经差不多够了&#xff0c;但是这并不是完整的TYPE-C,必须要补充上PD; 参考连接&#xff1a; TYPE-C PD浅谈&#xff08;一&#xff09;https://w…