C++语言·list链表

news2024/10/7 18:29:27

        其实现在在讲这些容器的时候,我们的重点已经不是它的接口都有什么,功能都是什么了,这些内容官网上都能查到,而且容器和容器之间接口的不同处很少,我在讲解的话也只是把官网上的东西截图下来复述一下。现在的重点其实都是容器的下半节,也就是容器的实现。

        list容器是一个带头双向循环链表

1. 构造 析构 赋值重载

1.1 构造

        官网资料:list::list - C++ Reference

        C++98中的构造还是老几样,不用传参的默认构造,用n个val构造,用某段迭代区间构造,拷贝构造,不过C++11中的initializer_list构造我们也可以使用

1.2 析构

        官网资料:list::~list - C++ Reference

1.3 赋值重载

        官网资料:list::operator= - C++ Reference

        C++98中只提供一种赋值方案,但是C++11标准中还可以用initializer_list赋值

2. 迭代器

        begin和end没啥好说的,前面有r说明是reverse迭代器,也就是倒着的迭代器,前面载有c就是const迭代器const_iterator,不过这些我们都不常用,主要还是用begin和end

        因为list是带头双向循环链表,因此它的迭代器于之前string或vector的随机迭代器不同,list的迭代器是双向迭代器

3.容量操作

        之前提到过max_size返回容器目前的最大容量,不过这是一个相当鸡肋的功能

4. 访问容器内容

        访问容器内容还是提供了front、back两个成员函数,但是并没有提供operator[ ]了,这是因为链表的数据不是像顺序表那样的数组模式,无法 [ ] 随机访问某个元素,如果硬要写重载也行,但是效率低下,就是每次访问都遍历一下链表。

        也就是说,在链表中我们访问元素的方式完全变成了迭代器访问

                

5. 内容更改操作

        assign重新赋值,不过这个成成员函数需要的参数和构造很像

        push_front pop_front push_back pop_back,头插头删,尾插尾删,这些我们都很熟悉了

        insert随机位置插入,erase随机位置删除

        swap交换两个链表,resize reverse调整链表大小,clear清空链表

6. 更多特殊操作

6.1 splice 转移链表节点

        官网资料:list::splice - C++ Reference

        这个成员函数的功能就是将另一个链表 x 中的节点拿过来拼接进这个节点中。

        通过参数很简单可以看出,可以选择拼接一整条链表,或者链表中的某个节点,或者链表中用迭代器化出来的某段。

                

6.2 remove 删除存储某元素的节点

        官网资料:list::remove - C++ Reference

        和另一个有关删除的成员函数erase不同,erase是通过迭代器指定删除某些位置。而remove通过节点中存储的数据判断是否删除该节点

                

6.3 unique 相邻相同元素只保留一个

        官网资料:list::unique - C++ Reference

        unique是将相邻的相同元素只保留第一个,我们暂时只用它的第一种重载。所以说当我们想让一个链表中的每种元素只出现一次,就要先给这个链表排序,然后再用unique,排序是为了让相同的元素聚集到一起,否则删不干净。

        左边是链表没排序就unique,这样会保留下每组相同数据中的第一个数据。右边是链表sort之后再unique的效果,排序后相同的元素就都聚到一起了,那再删出来的效果就是每种数据都留下一个了。

6.4 sort 排序

        官网资料:list::sort - C++ Reference

        库函数中的sort要求传过去的迭代器必须是像vector或string那样的随机迭代器,而list的迭代器是双向迭代器,这种迭代器是不支持减法的,因此list不能使用标准库中的sort函数,因此list有特别供给自己使用的sort,也是默认排升序的效果,如果我们传一个greater<T>仿函数,就可以排降序。

        但是链表排序的时间消耗比较大,如果将链表中的数据用迭代区间拷贝构造法弄到顺序表中再排序,排序所需时间是比直接在链表中排序少3倍。

6.5 merge 合并有序链表

        官网资料:list::merge - C++ Reference

        这个成员函数的功能就是将两个有序链表合并成一个有序链表,合并完后被合并的有序链表x就变成了空链表

        ​​​​​​​        ​​​​​​​        

6.6 reverse 逆置

        官网资料:list::reverse - C++ Reference

        逆置整个链表,直接调用一下就好

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

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

相关文章

【知识图谱】探索攻略:基础、构建、高级应用与相关论文方向

【知识图谱】相关文章汇总 写在最前面一、什么是知识图谱&#xff1f;二、相关历史文章代码实现&#xff1a;简单的知识图谱可视化知识图谱前身&#xff1a;信息抽取知识图谱应用1&#xff1a;社交网络分析知识图谱应用2&#xff1a;威胁情报挖掘知识图谱应用3&#xff1a;Code…

⌈ 传知代码 ⌋ 实现沉浸式交互故事体验

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

DNS服务的部署与配置(2)

1、dns的安装及开启 dnf install bind.x86_64 -y #安装 #Berkeley Internet Name Domain (BIND) systemctl enable --now named #启用dns服务&#xff0c;服务名称叫named firewall-cmd --permanent --add-servicedns #火墙设置 firewall-cmd --reload …

Linux(三)

Linux&#xff08;三&#xff09; Linux网络配置管理网络基础知识 IP地址A类 由1个字节网络地址3个字节主机地址B类 由2个字节网络地址2个主机地址C类 由3个字节网络地址1个主机地址D类:主要用于组播E类:为将来使用保留 子网掩码子网掩码作用网关DNS服务器 Linux用户管理用户的…

服务器数据恢复—同友存储raid5阵列上层虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 某市教育局同友存储&#xff0c;存储中有一组由数块磁盘组建的raid5阵列&#xff0c;存储空间划分若干lun。每个lun中有若干台虚拟机&#xff0c;其中有数台linux操作系统的虚拟机为重要数据。 存储结构&#xff1a; 服务器故障&#xff1a; r…

Linux之LLVM、Clang、Clang++区别及用法实例(六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Java 异步编程——Java内置线程调度器(Executor 框架)

文章目录 Java多线程的两级调度模型Executor 框架Executor 框架的组成概念Executor 框架中任务执行的两个阶段&#xff1a;任务提交和任务执行 在 Java1.5 以前&#xff0c;开发者必须手动实现自己的线程池&#xff1b;从 Java1.5 开始&#xff0c;Java 内部提供了线程池。 在J…

concurrency 并行编程

Goroutine go语言的魅力所在&#xff0c;高并发。 线程是操作系统调度的一种执行路径&#xff0c;用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始&#xff0c;即主线程&#xff0c;当该线程终止时&#xff0c;进程终止。这是因为主线程是应用程序的原点。然后…

LeetCode题练习与总结:二叉树的层序遍历Ⅱ--107

一、题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[…

springboot3微服务下结合springsecurity的认证授权实现

1. 简介 在微服务架构中&#xff0c;系统被拆分成许多小型、独立的服务&#xff0c;每个服务负责一个功能模块。这种架构风格带来了一系列的优势&#xff0c;如服务的独立性、弹性、可伸缩性等。然而&#xff0c;它也带来了一些挑战&#xff0c;特别是在安全性方面。这时候就体…

YOLOv5改进策略:Focaler-IoU损失函数改进

文章目录 1、前言2、摘要3、Focaler-IoU&#xff1a;4、代码实现5、目标检测系列文章 1、前言 ​ 目标检测是计算机视觉的基本任务之一&#xff0c;旨在识别图像中的目标并定位其位置。目标检测算法可分为基于锚点和无锚点的方法。基于锚点的方法包括Faster R-CNN、YOLO系列、…

数据结构 —— 栈 与 队列

1.栈 1.1栈的结构和概念 栈&#xff08;Stack&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的原则。栈只允许在一端插入和删除数据&#xff0c;这一端被称为栈顶&#xff08;top&#xff09;&a…

Hudi 多表摄取工具 HoodieMultiTableStreamer 配置方法与示例

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求&#xff1a; 1. 输入留言信息&#xff0c;点击提交&…

2024-6-遥远的救世主

2024-6-遥远的救世主 2024-4-18 豆豆 fatux&#xff1a; 2021.5.26 看完电视剧《天道》之后购买本书&#xff0c;断断续续一直没有读完。 非常好奇&#xff0c;一个什么样的作者能写出如此奇书。老丁&#xff0c;一个智者&#xff0c;智者是多么孤独&#xff0c;因为找不到同…

AtCoder Regular Contest 178 A~D

A.Good Permutation 2&#xff08;贪心&#xff09; 题意&#xff1a; 给你一个正整数 N N N和一个由 M M M个正整数 A ( A 1 , A 2 , … , A M ) A(A_{1},A_{2}, \dots,A_{M}) A(A1​,A2​,…,AM​)组成的序列。 在这里&#xff0c; A A A的所有元素都是介于 1 1 1和 N N …

nss做题

[NCTF 2018]签到题 1.f12在index.php中找到flag [NSSCTF 2022 Spring Recruit]ezgame 1.在js源码中就有flag [UUCTF 2022 新生赛]websign 1.打开环境后发现ctrlu和右键&#xff0c;f12都被禁用了。两种方法&#xff0c;第一种&#xff1a;禁用js&#xff1b;第二中提前打开…

数据结构(五)树与二叉树

2024年5月26日一稿(王道P142) 基本概念 术语 性质 二叉树 5.2.2 二叉树存储结构

vue3中基于element-plus封装一个表格弹框组件,要求可以单选和多选table数据

单选&#xff1a; <template><SelectMaterialref"selectMaterialRef"check"checkbox"select"selectMaterial"></SelectMaterial><el-button type"primary" size"small" icon"el-icon-plus"…