C++ list 的使用

目录

1. 构造函数

1.1 list ()

1.2 list (size_t n, const T& val = T())

1.3 list (InputIterator first, InputIterator last)

2. bool empty() const

3.  size_type size() const

4. T& front()

 4. T& back()

5. void push_front (const T& val)

6. void pop_front()

7. void push_back (const T& val)

8. void pop_back()

9. 迭代器

10. iterator insert (iterator pos, const T& val)

11.  void insert (iterator pos, size_t n, const T& val)

12. iterator erase (iterator pos)

13. void swap (list& x)

14. void resize (size_t n, const T& val = T())

15.  void clear()

16. 下面的这些函数都很好理解 

16.1 void remove (const T& val)

16.2 void unique()

16.2 void merge(list& x)

16.3 void sort()

16.4 void reverse()


list 的介绍,来源:list - C++ Reference (cplusplus.com)

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。

3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。

4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。

5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)

1. 构造函数

1.1 list ()

这里的 T 是模板参数,list 可以存储任意类型的数据嘛。

通过 list 的简介,我们知道 list 的底层其实是一个带头双向循环链表 (以下简称双链表),在定义 list 的时候,我们需要初始化一个哨兵位的头结点。哨兵位的头结点不存储有效数据。无参构造就是用来初始化哨兵位的头结点的!

1.2 list (size_t n, const T& val = T())

这个构造函数可以初始化一个长度为 n 的,值均为 val 的双链表。

#include<iostream>
#include<list>using namespace std;int main()
{list<int> lt(5, 8);//输出:8 8 8 8 8for (auto e : lt)cout << e << " ";cout << endl;
}

1.3 list (InputIterator first, InputIterator last)

这个构造函数可以用一段迭代器区间来初始化双链表。构造的区间:[first, last)。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{vector<int> arr;arr.push_back(1);arr.push_back(2);arr.push_back(3);arr.push_back(4);arr.push_back(5);list<int> lt(arr.begin(), arr.end());//输出:1 2 3 4 5for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

2. bool empty() const

判断一个链表是不是空链表!如果有有效数据,返回 true,反之返回 false。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt1;cout << lt1.empty() << endl; //输出:1list<int> lt2(5, 8);cout << lt2.empty() << endl; //输出:0return 0;
}

3.  size_type size() const

这个函数可以获取双链表的长度。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt2(5, 8);cout << lt2.size() << endl; //输出:5return 0;
}

4. T& front()

这个函数可以获取双链表的第一个有效元素。有 const 和非 const 两个版本,支持普通对象和 const 对象的调用。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{vector<int> arr;arr.push_back(1);arr.push_back(2);arr.push_back(3);arr.push_back(4);arr.push_back(5);list<int> lt(arr.begin(), arr.end());cout << lt.front() << endl; //输出:1return 0;
}

 4. T& back()

这个函数可以获取双链表的最后一个有效元素。有 const 和非 const 两个版本,支持普通对象和 const 对象的调用。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{vector<int> arr;arr.push_back(1);arr.push_back(2);arr.push_back(3);arr.push_back(4);arr.push_back(5);list<int> lt(arr.begin(), arr.end());cout << lt.back() << endl; //输出:5return 0;
}

5. void push_front (const T& val)

双链表头插元素。因为之前我们都用 C 语言实现过双链表,学习 list 的使用就非常简单啦!

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_front(4);lt.push_front(3);lt.push_front(2);lt.push_front(1);//输出:1 2 3 4for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

6. void pop_front()

双链表头删元素。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_front(4);lt.push_front(3);lt.push_front(2);lt.push_front(1);//输出:1 2 3 4for (auto e : lt)cout << e << " ";cout << endl;lt.pop_front();//输出:2 3 4for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

7. void push_back (const T& val)

双链表尾插元素。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//输出:1 2 3 4for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

8. void pop_back()

双链表尾删元素。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//输出:1 2 3 4for (auto e : lt)cout << e << " ";cout << endl;lt.pop_back();//输出:1 2 3for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

9. 迭代器

list 的迭代器就不是简单的原生指针了。因为他的物理空间并不连续,因此 list 的迭代器需要进行封装,使得迭代器解引用能够返回节点存储的数据,使得迭代器加加,指向下一个节点,等等。具体的操作到我们模拟实现 list 的时候再说。

下面的图是 list 迭代器 begin() 与 end() 迭代器对应的双链表节点。

10. iterator insert (iterator pos, const T& val)

这个函数可以在 list 的 pos 位置处,插入一个值为 val 的元素。返回值就是返回新插入的元素的位置对应的迭代器。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//在begin() 的位置插入 0 ,相当于头插lt.insert(lt.begin(), 0);//输出:0 1 2 3 4for (auto e : lt)cout << e << " ";cout << endl;//在end() 的位置插入 5 ,相当于尾插auto it = lt.insert(lt.end(), 5);cout << *it << endl; //输出:5//输出:0 1 2 3 4 5for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

11.  void insert (iterator pos, size_t n, const T& val)

这个函数可以在 pos 位置插入 n 个值为 val 的节点。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//在begin() 的 位置插入 3 个值为 0 的节点lt.insert(lt.begin(), 3, 0);//输出:0 0 0 1 2 3 4for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

12. iterator erase (iterator pos)

这个函数可以删除 pos 位置的双链表节点。不可以删除 end() 位置的节点,会报错的!VS2022 做了检查的。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//相当于头删lt.erase(lt.begin());//输出:2 3 4for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

13. void swap (list<T>& x)

这个函数可以交换两个链表。我们实现 list 的时候,list 类中维护的是哨兵位的头结点的指针,交换两个链表的指针就能实现这样的效果。仅限于我们自己实现的 list 类哈!list 实现方式多种多样!

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);list<int> lt2;lt2.push_back(5);lt2.push_back(6);lt2.push_back(7);lt2.push_back(8);lt1.swap(lt2);//输出:5 6 7 8for (auto e : lt1)cout << e << " ";cout << endl;//输出:1 2 3 4for (auto e : lt2)cout << e << " ";cout << endl;return 0;
}

14. void resize (size_t n, const T& val = T())

stl 库的接口风格都很相似,list 的resize 和 vector,string 的 resize 简直一毛一样。当 n 小于双链表的长度,直接截断,当 n 大于双链表的长度,会用 val 区初始化新插入的节点。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_back(0);lt.resize(5, 1);//输出: 0 1 1 1 1for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

15.  void clear()

清空链表,即释放所有链表节点。

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> lt;lt.push_back(0);lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.clear();//没有输出for (auto e : lt)cout << e << " ";cout << endl;return 0;
}

16. 下面的这些函数都很好理解 

16.1 void remove (const T& val)

移除链表中所有值为 val 的节点。

1 2 3 3 4 5 remove(3) :1 2 4 5。

16.2 void unique()

删除链表中重复的节点。

1 2 2 3 3 4 5 1 remove(3) :1 2 3 4 5 1。

这个函数只能对相邻的重复的数去重。因此多用于已经排好序的 list。

16.2 void merge(list<T>& x)

这个函数用于两个 list 的合并,前提是两个 list 都被排好序了!

例如:

list1:-1 2 3 5 8

list2:0 1 2 4 6 7

合并后的结果:-1 0 1 2 2 3 4 5 6 7 8。

16.3 void sort()

链表的排序。

16.4 void reverse()

链表的逆置。

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

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

相关文章

FL Studio 21 for Mac中文破解版百度网盘免费下载安装激活

FL Studio 21 for Mac中文破解版是Mac系统中的一款水果音乐编辑软件&#xff0c;提供多种插件&#xff0c;包括采样器、合成器和效果器&#xff0c;可编辑不同风格的音乐作品&#xff0c;Pattern/Song双模式&#xff0c;可兼容第三方插件和音效包&#xff0c;为您的创意插上翅膀…

java _JDBC 开发

目录 一.封装JDBCUtiles 二.事务 三.批处理 四.数据库连接池 C3P0 Druidf(德鲁伊&#xff09;阿里 五.Apache-DBUtiles 六.Apache-DBUtils 七.DAO 和增删改查 通用方法 - BasicDao 一.封装JDBCUtiles 说明&#xff1a;在jdbc操作中&#xff0c;获取连接和释放资源&#…

设计模式:代理模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《组合模式》 下一篇《命令模式》 简介&#xff1a; 代理模式&#xff0c;它是一种结构型设计模式&#xff0c;它通过引入一个代理对象来控制对原始对象的访问。代理模式的主要目的是在保持原始对象…

《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力

10.4.1 模型 Bahdanau 等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时&#xff0c;如果不是所有输入词元都相关&#xff0c;模型将仅对齐&#xff08;或参与&#xff09;输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现…

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…

LSKA(大可分离核注意力):重新思考CNN大核注意力设计

文章目录 摘要1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论 摘要 https://arxiv.org/pdf/2309.01439.pdf 大型可分离核注意力&#xff08;LSKA&#xff09;模块的视觉注意力网络&#xff08;VAN&#xff09;已…

Linux CentOS 8(firewalld的配置与管理)

Linux CentOS 8&#xff08;firewalld的配置与管理&#xff09; 目录 一、firewalld 简介二、firewalld 工作概念1、预定义区域&#xff08;管理员可以自定义修改&#xff09;2、预定义服务 三、firewalld 配置方法1、通过firewall-cmd配置2、通过firewall图形界面配置 四、配置…

利用Jpom在线构建Spring Boot项目

1 简介 前面介绍了运用Jpom构建部署Vue项目&#xff0c;最近研究了怎么部署Spring Boot项目&#xff0c;至此&#xff0c;一套简单的前后端项目就搞定了。 2 基本步骤 因为就是一个简单的自研测试项目&#xff0c;所以构建没有使用docker容器&#xff0c;直接用java -jar命令…

Java程序设计进阶

Java异常处理机制 异常 异常的最高父类是 Throwable&#xff0c;在 java.lang 包下。 Throwable 类的方法主要有&#xff1a; 方法说明public String getMessage()返回对象的错误信息public void printStackTrace()输出对象的跟踪信息到标准错误输出流public void printSta…

【项目设计】网络对战五子棋(下)

我不再装模作样地拥有很多朋友&#xff0c;而是回到了孤单之中&#xff0c;以真正的我开始了独自的生活。有时我也会因为寂寞而难以忍受空虚的折磨&#xff0c;但我宁愿以这样的方式来维护自己的自尊&#xff0c;也不愿以耻辱为代价去换取那种表面的朋友。 文章目录 一、项目设…

Postman笔记

文章目录 1.安装2.简介和使用流程3 postman使用3.1 测试集与HTTP请求发送HTTP请求和分析响应数据 3.2 发送HTTP请求和分析响应数据3.3 Postman中请求体提交方式3.4 Postman使用之接口测试3.5 使用Postman新建一个mock服务3.6 请求数据的参数化3.7 断言与脚本导出 1.安装 官网地…

DP读书:《openEuler操作系统》(五)进程与线程

进程与线程 进程的概念程序&#xff1a;从源码到执行1. 编译阶段:2. 加载阶段:3. 执行阶段: 程序的并发执行与进程抽象 进程的描述进程控制块1. 描述信息2. 控制信息3. CPU上下文4. 资源管理信息 进程状态1.就绪状态2.运行状态3.阻塞状态4.终止状态 进程的控制进程控制源语1.创…

CrossOver23.6软件激活码怎么获取 CrossOver软件2023怎么激活

CrossOver一款类虚拟机&#xff0c;它的主要功能是在mac系统中安装windows应用程序。其工作原理是将exe格式的windows应用程序安装包安装至CrossOver容器中&#xff0c;并将运行该exe文件所需的配置文件下载至容器中&#xff0c;便能在mac正常运行windows应用程序了。下面就让我…

如何构建一个外卖微信小程序

随着外卖行业的不断发展&#xff0c;越来越多的商家开始关注外卖微信小程序的开发。微信小程序具有使用方便、快速上线、用户覆盖广等优势&#xff0c;成为了商家们的首选。 那么&#xff0c;如何快速开发一个外卖微信小程序呢&#xff1f;下面就让我们来看看吧&#xff01; 首…

【C++入门:C++世界的奇幻之旅】

1. 什么是C 2. C发展史 3. C的重要性 4. C关键字 5. 命名空间 6. C输入&输出 7. 缺省参数 8. 函数重载 9. 引用 10. 内联函数 11. auto关键字(C11) 12. 基于范围的for循环(C11) 13. 指针空值---nullptr(C11)05. 1. 什么是C C语言是结构化和模块化的语言&…

什么是web3.0?

Web 3.0&#xff0c;也常被称为下一代互联网&#xff0c;代表着互联网的下一个重大演变。尽管关于Web 3.0的确切定义尚无共识&#xff0c;但它通常被认为是一种更分散、更开放且更智能的互联网。 以下是Web 3.0的一些主要特征和概念&#xff1a; 1. 去中心化 Web 3.0旨在减少…

人工智能:CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的知识梳理

卷积神经网络&#xff08;CNN&#xff09; 卷积神经网络&#xff08;CNN&#xff09;&#xff0c;也被称为ConvNets或Convolutional Neural Networks&#xff0c;是一种深度学习神经网络架构&#xff0c;主要用于处理和分析具有网格状结构的数据&#xff0c;特别是图像和视频数…

CSS中 通过自定义属性(变量)动态修改元素样式(以 el-input 为例)

传送门&#xff1a;CSS中 自定义属性&#xff08;变量&#xff09;详解 1. 需求及解决方案 需求&#xff1a;通常我们动态修改 div 元素的样式&#xff0c;使用 :style 和 :class 即可&#xff1b;但想要动态修改 如&#xff1a;Element-ui 中输入框&#xff08;input&#x…

Windows与Linux服务器互传文件

使用winscp实现图形化拖动的方式互传文件. 1.下载winscp软件并安装&#xff0c;官方地址&#xff1a; https://winscp.net/eng/index.php 2.打开软件&#xff1a; 文件协议选择scp&#xff0c;输入linux服务器的IP和端口号&#xff0c;然后输入你的用户名和密码就可以登陆了。…

postman打开后,以前的接口记录不在,问题解决

要不这些文件保存在C:\Users\{用户名}\AppData\Roaming\Postman 比如&#xff0c;你目前使用的window登录用户是abc&#xff0c;那么地址便是C:\Users\abc\AppData\Roaming\Postman 打开后&#xff0c;这个目录下会有一些命名为backup-yyyy-MM-ddThh-mm-ss.SSSZ.json类似的文…