细腻的链接:C++ list 之美的解读

细腻的链接:C++ list 之美的解读

前言:

小编在前几日刚写过关于vector容器的内容,现在小编list容器也学了一大部分了,小编先提前说一下学这部分的感悟,这个部分是我学C++以来第一次感到有难度的地方,特别是在list容器的模拟实现中便可以看出来,到时候再细说,总之就是我在这一部分感到有一点困难了,它很考察前面知识点,包括但不限于类和对象,模板,数据结构部分内容等等,这边话也不多说了,开启今日的学习时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文章目录

  • 细腻的链接:C++ list 之美的解读
    • 1.list的介绍
      • 1.1.list是什么
      • 1.2.list功能一览
    • 2.list功能讲述
      • 2.1.list的构造
        • 2.1.1.list(size_t n,const value_type& val = vlaue_type())
        • 2.1.2.list()
        • 2.1.3.list(const list& x)
        • 2.1.4.list(Inputlterator first,Inputlterator last)
      • 2.2.迭代器(iterator)的使用
        • re2.2.1.begin + end
        • 2.2.2.rbegin + rend
      • 2.3.list capacity
        • 2.3.1.empty
        • 2.3.2.size
      • 2.4.list element access
        • 2.4.1.front
        • 2.4.2.back
      • 2.5.list modifiers
        • 2.5.1.push_front
        • 2.5.2.pop_front
        • 2.5.3.push_back
        • 2.5.4.pop_front
        • 2.5.5.insert
        • 2.5.6.erase
        • 2.5.7.swap
        • 2.5.8.clear
    • 3.总结

正文:

1.list的介绍

1.1.list是什么

list也和我们之前学过的某个数据结构息息相关,它就是:双链表,list的底层实际上就是带头双向循环链表,恰好小编这里有一个很形象的展示它的图片,这边我就分享出来了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过上图我们就可以看出list的具体结构,它就是我们之前学过的双向带头循环链表(双链表),此时的list和上次我讲述的vector是一样的,它们都是一个模版类,因为vector容器的类型可能都是不相同的,他可以接受int,float,double作为类型。甚至list同样也可以存储string容器,可谓是很全能,这便是模版带来的好处,可以帮助我们完成许多事情。

1.2.list功能一览

下面小编先给各位展示一下网站上对于list容器的简介,可能有很多读者朋友是第一次看我的文章,所以我还是放上这个网站的链接:list - C++ Reference,各位读者朋友可以在这个网站看到list容器更为详细的介绍,只不过很考验各位的英语功底,我还是那句话

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面小编就和之前STL容器讲解一样,开始对于list部分函数的介绍~

2.list功能讲述

2.1.list的构造

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

构造函数也是我们的老朋友,每一个容器都是有它自己的构造函数的,连构造函数都没有,这个容器创建起来也是没有一点意义,下面小编就分别讲述一下部分构造函数的使用,可能讲的不全,但是只要先把这个掌握了,那么在掌握其他就容器的多了。

构造函数(constructor)接口说明
list (size_type n, const value_type& val =value_type())构造的list中包含n个值为val的元素
list()构造空的list
list (const list& x)拷贝构造函数
list (InputIterator fifirst, InputIterator last)用[first, last)区间中的元素构造list
2.1.1.list(size_t n,const value_type& val = vlaue_type())

这个构造函数,乍一看感觉有点困难,其实它是很简单的,这个函数小编在之前的容器中也不止一次说过,它的功能其实就是构造并初始化n个val罢了,它的形参之所以看起来如此的复杂,其实就是因为它是一个模版类罢了,下面小编展示用法:

std :: list<int> s1(10,1);  //这里我还是提醒一下,因为list是模板类,所以初始化必须显示初始化,告知编译器它内容的类型
2.1.2.list()

这个函数也是一个常客了,小编在前面也说过,它的功能其实就是构造并初始化一个空的list,下面我直接上代码:

std :: list<int>();
2.1.3.list(const list& x)

这个函数也是比较好认识的,通过括号里面的内容,我们便可以知晓它是一个很典型的拷贝构造函数的写法,这个函数小编在类和对象(3)讲过,感兴趣的读者朋友可以去看一看(每日推销),废话不多说,小编展示它的用法:

std :: list<int> s1;
std :: list<int> s2 = s1;  //也可以写成list<int>s2(s1),想写成啥就写成啥
2.1.4.list(Inputlterator first,Inputlterator last)

这个函数我也在之前讲过,看着这个有点复杂,其实作用是很简单的,它的作用无非就是用[first,last)区间(谨记这里是左闭右开区间)的因素构造list,下面我直接展示用法:

std :: list<int> s1;
std :: list<int> s2(s1.begin(),s1.end());

以上便就是构造函数的用法,构造函数在list众多接口中苏是比较容易的,下面小编继续往后进行讲述。

2.2.迭代器(iterator)的使用

对于迭代器,想必读者朋友到这里就不陌生了,它是一个很像指针的东西,只不过它并非就是指针,这里我先预告一下,小编在list类的模拟实现中,将不会再把指针包装成迭代器了,具体情况请看我推出的模拟使用篇章(大概很久,因为string我还没写),下面小编就讲述一下关于迭代器函数的使用,突然想起来一个C++11新加入的内容我没讲,那就是范围for,因为范围for的底层是迭代器,这里既然有迭代器,自然可以支持范围for,所以各位读者朋友记住就好。

函数声明接口声明
begin+end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rebgin+rend返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置
re2.2.1.begin + end

这两个函数也属于我们的老朋友了,小编在之前的容器讲解中就多次讲述了这俩函数,这里它们的作用可能和前面不太相同,因为此时的list是链表结构,此时的begin指向的是第一个有意义的结点,而end不在是最后一个位置,而是指向的哨兵位,不然的话遍历会出现死循环的情况,并且会完整的遍历一遍,虽然此时的迭代器不在是指针,但它和指针的用法还是一直的,下面小编带领各位展示它的用法:

using namespace std;
list<int> s1 = {1,2,3,4,5}; //这个操作小编没有在构造函数讲,实际上这个就是实现了一次隐式类型转换,小编在vector就说过,具体的可以看那篇文章。
auto it = s1.begin();
while(it != s1.end())
{
    cout << *it << " ";
    it++;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.2.2.rbegin + rend

这两个函数也属于是老朋友了,它俩的作用就是和上面的函数截然相反,就是遍历的顺序相反了,这便是反向迭代器,至于反向迭代器的深层次讲解,小编将会在之后的栈和队列的容器中会详细讲述,下面直接展示用法:

using namespace std;
list<int> s1 = {1,2,3,4,5}; 
auto it = s1.rbegin();
while(it != s1.rend())
{
    cout << *it << " ";
    it++;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上便就是迭代器的相关内容,由于比较简单,我就一笔带过了,对于这部分内容我有个图片的形象展示,我便分享出来帮助各位更好的去理解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.3.list capacity

正如其名,这部分将会讲述关于list空间相关的函数,不过讲述的其实也不算很多了,因为关键的就那几个,下面小编直接开讲。

函数声明接口说明
empty检测list是否为空,是返回rue,否则返回false
size返回ist中有效节点的个数
2.3.1.empty

这个函数自然不用多说了,它的名字就告知了各位它的用法,它的作用主要就是判断链表是否为空的,下面浅浅的展示用法:

std :: list<int> s1 = {1,2,3};
if(s1.empty())
{
    cout << 1;  //这里不放图片了,结果显而易见,自然不会打印1
}
2.3.2.size

这个函数也是老朋友了,它的功能是检测数list里面有多少个有效结点,譬如上面的代码,就知道它的size应该是有3个,哨兵位不算有效结点,下面展示用法:

std :: list<int> s1 = {1,2,3};
cout << s1.size() << endl; //这里自然打印三个,我就不放图片了

以上便就是小编对于空间函数的详解,可能有读者朋友好奇为啥子没有capcoaty,这里我只能说好好复习一下链表的知识,链表的特点就是随用随开辟,当我们创建新结点的时候就开辟一个新的,不用多开,所以这便是链表的便携之处,各位要知道,下面我们继续进入函数的讲解。

2.4.list element access

本来我不想讲述这个函数,但我看了看不讲吧可能很多读者朋友不懂,所以我还是讲讲吧,这个英文的翻译是链表的元素访问,所以它提供的函数自然就是访问链表中某些特定部分的函数,下面说说与它相关函数的讲解。

函数声明接口说明
front返回list的第一个节点中值的引用
back返回list的最后一个节点中值的引用
2.4.1.front

通过这个函数的函数名不难看出,这个函数的功能应该是和第一个有意义的结点有关的,确实,这个函数的作用就是返回第一个有效结点的值,由于难度不大,小编直接讲述这个函数的

std :: list<int> s1 = {1,2,3};
cout << s1.front() << endl;  //这个打印出是1,我就不截图了。
2.4.2.back

这个函数的作用其实也是很容易看出来的,这个单词的意思是有返回的意思,仔细想一想,到最后才可以返回,所以这个函数的作用就是返回最后一个结点的数据,下面还是展示用法:

std :: list<int> s1 = {2,3,4};
cout << s1.back() << endl;

以上便就是关于元素访问函数的讲解,下面我们继续往后讲解。

2.5.list modifiers

下面就是今天小编要讲述的最后一个接口,它是关于list的增删查改函数的讲解,下面不多废话,直接进入这个接口的详解。

函数声明接口说明
push_front在list首元素前插入值为val的元素
pop_front删除list中第一个元素
push_back在list尾部插入值为val的元素
pop_back删除list中最后一个元素
insert在ist position位置中插入值为val的元素
erase删除list position位置的元素
swap交换两个ist中的元素
clear清空ist中的有效元素
2.5.1.push_front

这个函数想必学过数据结构的朋友们都不陌生,它就是在前面容器都没有出现过的头插函数,旨在头部插入新结点,当然,肯定不是在哨兵位前面插入结点,它是在第一个有效元素的前面插入新的结点,小编在双链表的时候也讲述过这个函数的写法,同样的,我会在模拟实现的时候再次实现头插,各位读者朋友敬请期待,下面给上用法:

std :: list<int> s1 = {1,2,3};
s1.push_front(1);  //这样的话会打印出1,1,2,3,我就不用图片展示了
2.5.2.pop_front

有插入,自然就有删除函数,这个函数的作用就是起到头删的作用,当然不是删哨兵位,而是删除第一个有效结点如果链表里面有结点的话,那么会把第一个有效的结点进行删除,倘若里面只有一个哨兵位节点的话,那么是会报错的,下面小编展示用法:

std :: list<int> s1 = {1,2,3};
s1.pop_front();  //这样的话会打印出2,3,我就不用图片展示了
2.5.3.push_back

有头插函数,自然就有我们的老朋友——尾插函数,这个函数通过名字就可以知道,它是往最后一个位置插入新的结点,由于难度不达,小编直接展示用法:

std :: list<int> s1 = {1,3,4,5};
s1.push_back(1);  //这样的话会打印出1,3,4,5,1,我就不展示打印图了
2.5.4.pop_front

有尾插函数,自然就有尾删函数,这个函数的做用就是删除尾部的数据,当然,如果这个链表仅仅只有哨兵位一个结点的话,那么会报错,由于难度不大,我就直接上用法了:

std :: list<int> s1 = {1,2,3,4};
s1.pop_back();  //这样的话仅仅会删掉4这个结点的数据
2.5.5.insert

这个函数也是个老熟人了,它的作用是在任意位置上插入数据,所以它既可以实现头插尾插,也可以实现任意插入数据,在之后的尾插函数和头插函数的模拟实现中,在最后我们可以只用实现一个insert函数就好了,用insert套用实现它们,下面小编展示它的用法:

std :: list<int> s1 = {1,2,3,4};
s1.insert(s1.begin(),2);  //这是实现了头插
2.5.6.erase

既然有指定位置插入函数,那么肯定有指定位置删除函数,这个函数的作用同样也可以实现头删尾删,下面小编展示用法:

std :: list<int> s1 = {1,2,3,4};
s1.erase(s1.begin());  //这里我就简单实现了一下头插函数
2.5.7.swap

swap函数,想必这个肯定不陌生了,我们在C语言阶段就多次使用到swap函数,我记着在数据结构堆的实现中我还用到了这个函数,实现了堆排序,在C++阶段我在模版的时候就用它作为引子,我忘记当时我说没说,swap函数在库中就拥有,只不过库里的swap函数最好不要用,因为代价是很伤的,具体情况请看我以后写的string模拟实现,下面展示它的用法:

using namespace std;
list<int> s1 = {1,2,3,4};
list<int> s2 = {2,5,7,12};
s1.swap(s2);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.5.8.clear

这个函数我之前在string应该说过…吧,这个函数作用就是起清空数据的作用,倘若我们写了一个很多结点的list,想要一次性释放,不放试试这个函数,直接就把所有结点给释放了,下面小编直接展示他的用法:

using namespace std;
list<int> s1 = {1,2,3,4,5,51,1,2,3,4,4};
s1.clear();  //使用它会直接被清空(里面的结点)。

以上便就是小编将要讲述的增删查改函数,这就是小编将要讲述的最后一个功能,其实学多了容器,各位读者朋友不难发现,容器的功能的使用其实都是很相似的,只要我们掌握了其中一个容器的写法,剩余容器的写法便可以会轻易的掌握,难的是底层逻辑,我将会在不久的将来诞生出list容器的模拟实现文章,希望不会太久。

3.总结

本文到这里也是创作结束了,感觉周末的我,还是比较贪玩的,这篇文章我花了两天才写完,确实是我懈怠了,这里提醒那些爱看小说的读者朋友,千万不要沉迷于小说,不然会耽误很多事,对于文章有任何错误的地方,可以在评论区指出,我会定期逛评论区来给大家解惑,那么各位大佬们,我们下一篇文章见啦!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

百度集度嵌入式面试题及参考答案

linux 系统之间通信机制有哪些&#xff1f; Linux 系统之间存在多种通信机制&#xff0c;以下是一些常见的通信机制及其详细介绍。 管道&#xff08;Pipe&#xff09; 原理&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动。它基于文件描述符&#xff0c;在…

使用vite+react+ts+Ant Design开发后台管理项目(五)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术…

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数&#xff08;Lagrange function&#xff09;通常用于优化问题&#xff0c;尤其是带有约束的优化问题。其一般形式为&#xff1a; 其中&#xff1a; f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…

微信全新体验来袭,让你的微信再升级

在这个信息爆炸的时代&#xff0c;微信作为我们日常生活中不可或缺的社交工具&#xff0c;每一次的更新都牵动着亿万用户的心。 最近&#xff0c;微信再次发力&#xff0c;为安卓、iOS、鸿蒙以及PC端的用户带来了全新的功能体验。今天&#xff0c;就让我们一起走进这些新功能&…

ES + SkyWalking + Spring Boot:日志分析与服务监控(三)

目录 一、搭建SkyWalking 1.1 版本选择 1.2 下载安装 1.3 配置启动 1.4 SkyWalking UI介绍 二、Springboot项目使用 2.1 Agent下载 2.2 Agent配置skywalking oap地址 2.3 IDEA配置Agent地址 2.4 生成的ES索引介绍 三、在kibana上查看日志 四、问题和解决 3.1 日志…

算法笔记:Day-09(初始动态规划)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

Jenkins 构建时候提示超时错误被终止

近期在使用 Jenkins 构建项目的时候&#xff0c;经常性得到错误&#xff1a; - Building for production... Build timed out (after 3 minutes). Marking the build as aborted.当再次重构后&#xff0c;貌似没有问题&#xff0c;等候一段时间后问题又再次出现。 问题和解决…

angular实现list列表和翻页效果

说明&#xff1a;angular实现list列表和翻页效果 上一页 当前页面 下一页 效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\car\car.component.css .example-form-fields {display: flex;align-items: flex-start; }mat-list-item{background: antiquew…

基于SpringBoot+Gpt个人健康管家管理系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

Ubuntu开启FTP与SSH服务

在配置开发环境时&#xff0c;这两个配置感觉是最有用的&#xff0c;开启FTP服务可以将远程linux上的文件映射到Windows上&#xff0c;不管是使用虚拟机还是嵌入式linux设备&#xff0c;特别在开发写代码的时候&#xff0c;映射到Windows上使用VS code打开编写比在linux上编写舒…

GitHub上传自己的项目

目录 一、安装Git插件 1&#xff09;下载 2&#xff09;安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user]&#xff0c;下次可以直接用 一、安装Git插件 1&#xff09;下载 下载地址&#x…

10款音视频转文字工具体验记!!!

如今互联网数据的便捷&#xff0c;记录不仅仅只有文字的形式&#xff0c;还有视频的形式&#xff01;但是有时候&#xff0c;我们只有视频&#xff0c;却需要文字文档&#xff0c;那要怎么办呢&#xff1f;今天我要和大家分享一下我使用过的那些语音转文字工具的体验感受。语音…

SpringBoot在线教育系统:集成第三方服务

5系统详细实现 5.1 普通管理员管理 管理员可以对普通管理员账号信息进行添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 普通管理员管理界面 5.2 课程管理员管理 管理员可以对课程管理员进行添加修改删除操作。具体界面如图5.2所示。 图5.2 课程管理员管理界面 5.3 …

深度学习基础知识-损失函数

目录 1. 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2. 平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09; 3. Huber 损失 4. 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 5. KL 散度&#xff08;Kullback-Leibler Divergence&…

Web Broker(Web服务应用程序)入门教程(1)

1、介绍 Web Broker 组件&#xff08;位于工具面板的“Internet”选项卡中&#xff09;可以帮助您创建与特定统一资源标识符&#xff08;URI&#xff09;相关联的事件处理程序。当处理完成后&#xff0c;您可以通过编程方式构建 HTML 或 XML 文档&#xff0c;并将它们传输给客…

基于springboot+vue实现的养老院管理系统(源码+L文+ppt)

基于springbootvue实现的养老院管理系统&#xff08;源码L文ppt&#xff09;4-106 养老院系统管理是一个综合性养老在线平台&#xff0c;旨在综合并简化养老机构中的照护流程。该系统集成了多种功能&#xff0c;以支持医生、护士、家属及管理员等不同角色的需求。对于医务人员而…

dify实战案例分享-基于多模态模型的发票识别

1 什么是dify Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#xff0c;旨在简化和加速生成式AI应用的创建和部署。它结合了后端即服务&#xff08;Backend as Service, BaaS&#xff09;和LLMOps的理念&#xff0c;使开发者能够快速搭建生产级的AI应用…

QML项目实战:自定义Switch按钮

目录 一.添加头文件 1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Switch 三.标签 四.效果 五.代码 一.添加头文件 1.QtQuick.Controls 2.1 QtQuick.Controls 提供了一组预定义的 UI 控件&#xff0c;这些控件可以用于构建现代、响应式的用户界面。它包…

开源框架Openlayers:就业必学,打造3D互动式地图

OpenLayers是一个开源的WebGIS库&#xff0c;支持多种地图类型&#xff0c;提供丰富的功能和API&#xff0c;支持多种格式&#xff0c;可以进行空间分析和可视化&#xff0c;还可以制作融合图层和定制地图。 在招聘市场中&#xff0c;OpenLayers的地位也是不可小觑的&#xff0…

React系列教程(2)React哲学

豆约翰习惯将掌握某一技术分为5个层次&#xff1a;初窥门径&#xff0c;小试牛刀&#xff0c;渐入佳境&#xff0c;得心应手&#xff0c;玩转自如 本篇属于React框架中的第1层次即初窥门径 我们认为&#xff0c;React 是用 JavaScript 构建快速响应的大型 Web 应用程序的首选方…