C++——STL之list详解

news2025/4/8 14:03:18

C++——STL之list详解

  • 🏐什么是list
  • 🏐list的使用
    • 🏀splice
    • 🏀unique
    • 🏀remove
    • 🏀sort
  • 🏐list的实现
    • 🏀迭代器类(体会c++的优势)
      • ⚽迭代器的构造
      • ⚽迭代器的模板参数
  • 💬总结

👀先看这里👈
😀作者:江不平
📖博客:江不平的博客
📕学如逆水行舟,不进则退
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❀本人水平有限,如果发现有错误的地方希望可以告诉我,共同进步👍

🏐什么是list

在这里插入图片描述

list是一个顺序容器,支持常数时间(也就是O(1))内进行任意位置的插入删除,还支持双向迭代。

  • list容器作为双向链表实现;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。
  • 与其他基本标准序列容器(array, vector and deque)相比, list在容器内已经获得迭代器的任何位置插入、提取和移动元素时通常表现更好,因此在大量使用这些元素的算法中也是如此,例如排序算法。
  • 与其他序列容器相比,主要缺点是它们无法通过其位置直接访问元素;例如,要访问列表中的第六个元素,必须从已知位置(如开始或结束)迭代到该位置,这需要这些元素之间的距离的线性时间。它们还会消耗一些额外的内存来保持与每个元素关联的链接信息(这可能是大型小型元素列表的重要因素)。

🏐list的使用

🏀splice

我们来看一些之前的模板没出现的接口(都不怎么常用)
在这里插入图片描述
splice,接合的意思可以理解为转移,从一个链表转移到另一个链表的某个位置处。

🏀unique

在这里插入图片描述
去重的接口,再用这个之前我们需要先进行排序,所以我们一搬不会去用,而排序是有消耗的。去重有更好的方法,我们以后再介绍

🏀remove

在这里插入图片描述
remove的功能其实可以用find+erase完成

🏀sort

在这里插入图片描述
库里已经有个sort了,为什么list自己还有个sort,因为库里的对list不适用,库里的sort是快排,针对连续的空间进行排序,包含三数取中一系列操作,知道两边找中间的操作显然对链表来说难以实现,所以对于list链表式的结构,冒泡插入归并排序都可,归并最好,list的sort就是这么来的
归并对于数组来说缺陷就是有空间复杂度,对于链表来说就不会了
假如说有百万个数据让你来排序,你会选择vector还是list呢?不假思索还是会选择vector,list链表式的不适合排序,还不如拷贝到vector中排序后再拷贝到list快。

🏐list的实现

🏀迭代器类(体会c++的优势)

⚽迭代器的构造

template<class T>
	struct list_node
	{
		T _data;
		list_node<T>* _next;
		list_node<T>* _prev;

		list_node(const T& x = T())
			:_data(x)
			, _next(nullptr)
			, _prev(nullptr)
		{}
	}
	struct __list_iterator
	{
		typedef list_node<T> Node;
		Node* _node;
		
		_list_iterator(node* pnode)
			:_pnode(pnode)
	{}
	}

为什么要写一个迭代器类来实现list?string和vector就不需要。

因为string和vector对象的数据都存储在了一块连续的内存空间,我们通过对象的指针进行自增、自减以及解引用等操作,就可以对相应位置的数据进行一系列操作,因此string和vector当中的迭代器就是原生指针。而list的对象是结点,这里结点的指针并不能访问到数据,我们需要充分的利用c++的优势和特性——封装和运算符重载。

⚽迭代器的模板参数

typedef _list_iterator<T, T&, T*> iterator;
typedef _list_iterator<T, const T&, const T*> const_iterator;

为什么我们要用三个模板参数,原因就在于碰到不能修改的对象也就是const对象时,我们无法对其进行访问,因为用普通迭代器的话,在*迭代器对象(*it)时会出现权限的放大,我们这里通过对象实例化来解决,什么样的对象用什么样的迭代器,这也体现了泛型编程的优势,不然的话我们就出现重新写一个类,只有几个接口不一样的问题了,这是非常麻烦和不可取的,太冗余了。

💬总结

  • 迭代器类,就是对结点指针进行了封装,对其各种运算符进行了重载,让结点指针的各种行为看起来和普通指针一样。

在这里插入图片描述

觉得还不错的铁汁点赞关注一下吧😀

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

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

相关文章

Java项目:springboot+vue电影院会员管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目代码架构设计简单&#xff0c;注释齐全&#xff0c;结构清晰&#xff0c;适合同为java初学者参考。 cinema项目是一套电影院会员管理系统…

第十五章 规则学习

15.1 基本概念 机器学习中的规则通常是指语义明确、能描述数据分布所隐含的客观规律或邻域概念、可写成“若…,则…”形式的逻辑规则。规则学习是从训练数据中学习出一组能用于对未见示例进行判别的规则。 与神经网络、支持向量机这样的黑箱模型相比&#xff0c;规则学习具有…

NewStarCTF公开赛week3密码学前两道题的wp

目录一、keyExchange1.原题2.考察知识点与解题思路Diffie-Hellman密钥交换3.解题脚本二、Prof. Shamirs Secret1.原题2.考察知识点与解题思路Shamir 门限方案3.解题脚本一、keyExchange 1.原题 题目给出的是题目给出的是加密过程和输出&#xff1a; from secret import flag…

【LeetCode每日一题:2011. 执行操作后的变量值~~~模拟】

题目描述 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言&#xff1a; X 和 X 使变量 X 的值 加 1 –X 和 X-- 使变量 X 的值 减 1 最初&#xff0c;X 的值是 0 给你一个字符串数组 operations &#xff0c;这是由操作组成的一个列表&#xff0c;返回执行所有操作后&…

Merge-On-Write 的处理流程

简单来讲&#xff0c;Merge-On-Write 的处理流程是&#xff1a; 对于每一条 Key&#xff0c;查找它在 Base 数据中的位置&#xff08;rowsetid segmentid 行号&#xff09; 如果 Key 存在&#xff0c;则将该行数据标记删除。标记删除的信息记录在 Delete Bitmap 中&#xff…

【C++】多态(万字详解) —— 条件 | 虚函数重写 | 抽象类 | 多态的原理

&#x1f308;欢迎来到C专栏~~多态 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x1…

Logoist - 适用于设计师以及初次使用者,快速制作精美 logo

Logoist - 适用于设计师以及初次使用者的快速制作精美 logo 工具 从简单的标识到设计开发。它只需要一点时间来创建令人印象深刻的图像和矢量图形与Logoist。 我们的一体化应用程序为您提供了您需要的一切&#xff0c;将您的创意付诸实践或寻找新的灵感!它适合专业设计师和插画…

阿里云将加速与伙伴合作 促进Web3.0生态发展

12 月 15 日&#xff0c;在Web3.0 Cloud Day Singapore 2022 活动上&#xff0c;阿里云新加坡、南亚和泰国总经理 Dr Derek Wang 表示&#xff0c;阿里云将加速和伙伴的合作以促进创新。“我们正在与我们的合作伙伴合作以实现创新。我们仍然处于 Web 3.0 的早期阶段。我们仍然需…

【蓝桥杯选拔赛真题53】Scratch破解保险柜 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch破解保险柜 一、题目要求 编程实现 二、案例分析 1、角色分析

大数据处理之ClickHouse概述及架构参考(未完)

一、概述 中移某业务拨测系统基于业务数据拨测指标及日志的分析需要&#xff0c;随着Clickhouse在OLAP领域的快速崛起&#xff0c;以及一些特性考虑&#xff0c;比如&#xff1a; 数据量会很大&#xff0c;最好需要分布式&#xff1b; 支持实时写入&#xff0c;支持快速计算&a…

数据库管理-第四十九期 Exadata的存储节点管理(20221223)

数据库管理 2022-12-23第四十九期 Exadata的存储节点管理1 咋个查看数据是否被缓存到闪存卡了没2 EM13.5的Exadata监控3 存储降级总结第四十九期 Exadata的存储节点管理 本周二&#xff0c;抗原终于阴性了&#xff0c;星期三开始就回到现场开始办公。上周既然说了Exadata关于存…

[C++: 引用】

To shine,not be illuminated. 目录 1 引用概念 2 引用特性 3 常引用 4 使用场景 4.1 引用做参数 4.2 做返回值 5 传值、传引用效率比较 6 引用和指针的区别 7 总结 1 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为…

Java+Swing+mysql会员卡管理系统

JavaSwingmysql会员卡管理系统一、系统介绍二、功能展示1.主页页面2.会员信息查询3.会员信息删除三、系统实现1.members.java四、其它1.其他系统实现一、系统介绍 使用 Java 技术开发一个会员卡管理系统&#xff0c;具体实现功能如下&#xff1a; 1. 程序启动显示主界面&#…

Vue:从组件开始学习

文章目录Vue组件生命周期根据官网文档&#xff0c;我们可以快速使用vue3创建自己的应用代码&#xff1a;npm init vuelatest&#xff0c;然后根据自己的需要来选择对应的配置&#xff1a; 默认使用vite来配置项目的。 在main.ts入口文件中&#xff0c;我们可以看到&#xff0…

非零基础自学Golang 第17章 HTTP编程(上) 17.5 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第17章 HTTP编程(上)17.5 知识拓展17.5.1 curl工具详解第17章 HTTP编程(上) 17.5 知识拓展 17.5.1 curl工具详解 【1】curl 简介 curl是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;于1997年首次发行。它支持文…

Java+MySQL基于ssm的互助救援车队管理系统

此项目能够更全面的为社会贡献爱心&#xff0c;更及时的帮助求助人&#xff0c;然后在后台完成整个过程最后在通过广播好人好事&#xff0c;在高考爱心送子、养老院奉献爱心等活动更能做到统一化&#xff0c;更有序让注册的私家车主有的放矢&#xff0c;供献爱心。现在社会的信…

MyBatis-Plus(实用篇)

文章目录一、基础组件&#xff08;接口和实现类&#xff09;1、BaseMapper\<T>2、IService\<T>3、链式查询与修改4、调用Service层操作数据二、常用注解1、TableName2、TableId3、TbaleField4、TableLogic三、条件构造器1、wapper介绍2、构造器常用方法3、组装条件…

编程艺术之变成原则

编程有一个原则&#xff0c;就是尽可能去避免重复的代码。 类的开闭原则&#xff0c;类做好后&#xff0c;就尽量不要再在类上面在修改代码&#xff0c; 耦合度&#xff1a;简单的一个例子&#xff0c;活字印刷术在之前是整版印刷&#xff0c;导致&#xff0c;如果有一个字要…

作一回白嫖怪:写一个脚本自动获取ST官网积分,用积分领取奖品

环境&#xff1a;Python、selenium、ubuntu22.04 网址&#xff1a;STMCU中文官网 chrome: 版本 108.0.5359.124&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; chromeDriver: CNPM Binaries Mirror 这两个文件我打包起来了&#xff0c;0积分方便大家…

【表格合并与底纹】vue-elementul表格简单实现合并单元格,与列和行给底纹颜色

前言 这是一个很常见的需求啊&#xff0c;因为很多公司都会涉及到写表格展示数据 那么在某些公司内就会出现为了让数据更直观的感受到 而让你给某些行和列用颜色标出来。使得看起来更方便 那么这里就汇总一下常用的横竖合并以及横竖颜色底纹如何实现 效果图 这是写的一个dem…