【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个1
 
list<int> l3(l2);//将l2的内容拷贝给l3,并初始化l3
 
list<int> l4(l2.begin(), l2.begin() + 5);//迭代器区间构造

2、赋值重载

list& operator= (const list& x);
 
 
//使用
list<int> l2(10, 1);//初始化元素为10个1
 
list<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它是由返回值的, 返回一个迭代器,这个迭代器指向被删除元素的后一个元素的位置

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab|二阶锥松弛在配电网最优潮流计算中的应用

目录 一、主要内容 二、部分代码 三、程序代码 四、下载链接 一、主要内容 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优潮流计算模型&#xff1b;其次结合辐射型配电网潮流特点建立支路潮流约束&#xff0c;并考虑配电网中的可…

平平科技工作室-Python-步步惊心

一.准备图片 放在 文件夹取名为imgs,分为两种boys和girls 二.编写程序 首先创建一个文件名为index.py 其次编写程序 # coding:utf-8 import sys, time, easygui, os, pygame from pygame.locals import * pygame.init() # 设置窗口显示位置、大小、颜色、标题 os.environ[ …

Go语言的包管理工具go mod与之前的GOPATH有什么区别?

在深入探讨Go语言的包管理工具go mod与之前的GOPATH之间的区别之前&#xff0c;我们首先需要理解这两个概念各自的作用和背景。 GOPATH时代 在Go语言早期版本中&#xff0c;GOPATH是一个非常重要的环境变量。它告诉Go工具链在哪里查找你的Go代码、第三方库以及编译后的二进制…

C#描述-计算机视觉OpenCV(4):图像分割

C#描述-计算机视觉OpenCV&#xff08;4&#xff09;&#xff1a;图像分割 前言用 GrabCut 算法分割图像实例展示 前言 本文中如果有什么没说明的地方&#xff0c;大概率在前文中描述过了。 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算…

docker 指定根目录 迁移根目录

docker 指定根目录 1、问题描述2、问题分析3、解决方法3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决根目录空间不够问题3.1.0、方法思路3.1.1、docker官网安装文档3.1.2、下载docker安装包3.1.3、安装docker 26.1.03…

记一次从登录框到前台rce

接口未授权挖掘 在网站未登录的情况下&#xff0c;由于不知道后台接口。唯一办法通过js文件、路径扫描。通过这种收集方式使用burp进行批量扫描&#xff0c;分别探测GET/POST请求。观察响应包跟状态码。判断响应包&#xff0c;确定存在未授权后&#xff0c;再构造数据包。 2 突…

C++ | Leetcode C++题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; class Solution { public:int minPathSum(vector<vector<int>>& grid) {if (grid.size() 0 || grid[0].size() 0) {return 0;}int rows grid.size(), columns grid[0].size();auto dp vector < vector <int>…

机器学习笔记-18

异常检测问题 异常检测虽然主要用于无监督学习问题上&#xff0c;但是和监督学习问题很相似。 异常检测(Anomaly Detection)&#xff1a;给定正确样本集{ x ( 1 ) , x ( 2 ) . . . x ( n ) x^{(1)},x^{(2)}...x^{(n)} x(1),x(2)...x(n)}&#xff0c;记新样本即要检测的样本为…

NIO(非阻塞I/O)和IO(阻塞I/O)详解

文章目录 一、NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞I/O&#xff09;1、Channel&#xff08;通道&#xff09;与Buffer&#xff08;缓冲区&#xff09;1.1、使用ByteBuffer读取文件1.2、ByteBuffer 方法1.2、ByteBuffer 结构1.3、字符串与 ByteBuffer 互转1.4 Sca…

代码随想录算法训练营DAY48|C++动态规划Part9|121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

文章目录 121.买卖股票的最佳时机思路CPP代码 122.买卖股票的最佳时机II思路CPP代码 123.买卖股票的最佳时机III思路CPP代码 121.买卖股票的最佳时机 力扣题目链接 文章讲解&#xff1a;121.买卖股票的最佳时机 视频讲解&#xff1a;动态规划之 LeetCode&#xff1a;121.买卖股…

BJFUOJ-C++程序设计-实验3-继承和虚函数

A TableTennisPlayer 答案&#xff1a; #include<iostream> #include<cstring> using namespace std;class TableTennisPlayer{ private:string firstname;string lastname;bool hasTable;public:TableTennisPlayer(const string &, const string &, bool…

jupyter notebook使用与本地位置设置

本地安装好Anaconda之后&#xff0c;自带的有Jupter notebook。 使用jupyter notebook 使用jupyter notebook时&#xff0c;可以直接打开或者搜索打开&#xff1a; 打开后&#xff0c;我们生成的或者编辑的一些文件&#xff0c;都可以看到&#xff0c;如下&#xff1a; j…

HTML标签大全

本文是用于解释文章中使用的标签&#xff0c;方便萌新理解标签结构&#xff0c;也方便大佬忘了过来查一下~ 本文根据博客教学进度实时更新&#xff0c;可以收藏一下~ 文章目录 第二篇1.template2.div3. button 第三篇4.ul5.li 第二篇 第二篇链接 1.template <template&g…

计算机408备考-数据结构重要知识点-数据结构的定义

请关注一下B站账号&#xff1a;谭同学很nice&#xff01;后期更新发布在这个账号上。。【计算机408备考-数据结构重要知识点-数据结构的定义-哔哩哔哩】https://b23.tv/x7shjNf 数据是信息的载体。数据元素是数据的基本单位。一个数据元素可由若干数据项组成&#xff0c;数据项…

利用大语言模型(KIMI)构建控制信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景&#xff0c;对事物的关注重点的不同的。例如&#xff0c;对于一个智能传感器而言&#xff0c;从商业的角度看&#xff0c;产品的信息模型中应该包括产品的类型&#xff0c;名…

ESD管 AZ5825-01F国产替代型号ESDA05CPX

已经有很多客户选用雷卯的ESDA05CPX替代Amazing 的 AZ5825-01F&#xff0c; 客户可以获得更好的价格和更快的交期&#xff0c;主要应用于对5V供电和4.5V供电电流较大的Vbus线路插拔保护等。 雷卯ESDA05CPX优势&#xff1a; 带回扫 &#xff0c;钳位电压Vc 低&#xff0c;IPP为…

逻辑漏洞:水平越权、垂直越权靶场练习

目录 1、身份认证失效漏洞实战 2、YXCMS检测数据比对弱&#xff08;水平越权&#xff09; 3、MINICMS权限操作无验证&#xff08;垂直越权&#xff09; 1、身份认证失效漏洞实战 上一篇学习了水平越权和垂直越权的相关基本知识&#xff0c;在本篇还是继续学习&#xff0c;这…

利用亚马逊云科技GenAI企业助手Amazon Q Business构建企业代码开发知识库

2024年五一节假日的前一天&#xff0c;亚马逊云科技正式重磅发布了云计算行业期待已久的服务——Amazon Q Business。Amazon Q Business是专为企业用户打造的一个开箱即用的完善而强大企业GenAI助手。企业用户只需要将Amazon Q Business连接到现有的企业内部数据源&#xff0c;…

整合文本和知识图谱嵌入提升RAG的性能

我们以前的文章中介绍过将知识图谱与RAG结合的示例&#xff0c;在本篇文章中我们将文本和知识图谱结合&#xff0c;来提升我们RAG的性能 文本嵌入的RAG 文本嵌入是单词或短语的数字表示&#xff0c;可以有效地捕捉它们的含义和上下文。可以将它们视为单词的唯一标识符——捕获…

文件传送协议

壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议&#xff1b; 在互联网发展的早期阶段&#xff0c;用FTP传送文件约占整个互联网的通信量的三分之一&#xff1b;知道1995年&#xff0c;www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…