【C++】list简单介绍

news2024/11/22 19:58:30

list基本功能介绍

    • 前言
    • 正式开始
      • 构造函数
      • push_back
      • iterator
      • push_front
      • insert
      • erase
      • splice
      • remove
      • unique
      • reverse
      • sort
      • merge

在这里插入图片描述

前言

本篇不会讲太多细节,就说一下STL库中一些函数的基本用法,如果想要了解细节上的东西的话,建议看我string的介绍:string介绍

还是照着cplusplus的那个网站中的内容讲:STL -> list

正式开始

STL库中的链表是一个带头双向循环链表。也是存取元素最方便的链表。我前面也用C语言实现过这个带头双向循环链表,但是实现的话肯定是没有 C++ 的实现起来更加方便的,模拟实现的话,下一篇博客再说。

链表节点什么的基本概念就不说了,直接讲库中的函数接口。

构造函数

老样子,STL库中各个容器的实现都是有很多相似的地方的。
在这里插入图片描述
就还是那几样。无参的、n个val的、迭代区间的、拷贝构造。

再说析构,没啥好讲的,就是生命周期结束自动调用,释放空间。

然后说个常用的:push_back

push_back

在这里插入图片描述
尾插。直接上例子:
在这里插入图片描述
数据有了,看看怎么遍历。

iterator

和前面vector不同的是,list不是连续的空间了,所以不能支持简单的[ ]重载来进行任意位置的访问。所以我们此处想要遍历list的话,就只能用迭代器了。

在这里插入图片描述
或者是范围for,但是底层也是迭代器。

在这里插入图片描述
但是要注意,范围for中只是简单的赋值操作,可能会出现深拷贝的情况导致开销很大,这时如果我们不需要改变list中节点内容的话,尽量传const + 引用。
在这里插入图片描述
也可用迭代器修改。
在这里插入图片描述
list也有rbegin、rend还有const的。用法都和前面的string和vector一样。和这两个不一样的是list有push_front和pop_front。

push_front

在这里插入图片描述
空间不连续,尽管是头插,时间复杂度也是O(1),因为不需要挪动数据。

再说insert和erase。

insert

在这里插入图片描述
参数:(pos, val) 、(pos, n, val) 、(pos, first, last)这三样。

还是老样子,用的时候需要用find。
find用的时候还是迭代器区间,要找的值。
用完find后要判断是否找到。

直接上例子:
在这里插入图片描述
这里要注意一点,list的insert不存在迭代器失效的问题,因为list空间是不连续的,在某一结点前插入一个节点,原节点的地址是不会改变的。
所以我们可以多次在同一位置插入。
在这里插入图片描述
但是erase会出现迭代器失效的问题。

erase

先看一个正常的例子:
在这里插入图片描述

再说一个不正常的例子:

在这里插入图片描述
这里连续两次释放了同一块空间,但是因为list空间不连续,删除一个节点后其他节点的地址是不会变的,所以没有其他节点顶替这个被删除的节点。不像string和vector那样会有其他元素顶替上来。所以说删除了之后不就能再对这个节点进行任何操作了,不然就是非法访问。

看:
在这里插入图片描述
出错了。

然后剩下的那些基本函数别的容器中也有,就不说了。
说一下list自带的。
在这里插入图片描述
上面这几个函数了解就好,不需要死记,用的时候再查一下就好了。

splice

在这里插入图片描述

这个函数功能是转移数据,将一个链表中的数据转给另一个链表。
(pos, x),这个是把链表x中的数据转移到当前量表中的pos位置之前。
(pos, x, i),把x中第i位置处的元素转移在pos之前。
(pos, x, first, last),把x中[first, last)的元素转移到pos前。

注意,转移后x中对应的元素会消失。

就直接看官网中给的例子吧:
在这里插入图片描述

remove

在这里插入图片描述
除去list中的元素,看我圈红的部分,remove会把list中所有值为val的节点都删去。

例子:
在这里插入图片描述

unique

在这里插入图片描述
这个函数就是去重的功能。但是不是全部去重。而是将相连位置的元素去重,留下一个元素。

在这里插入图片描述
所以说,如果不考虑结果的元素顺序并且想要将所有重复元素去处的话,我们可以先排序,再用unique。
在这里插入图片描述

reverse

这个函数是list自带的。
这里带头双向循环链表,逆置的话,只需要依次遍历最左边和最右边,两边交换数值,就可实现逆置,不需要改链表的每个节点的指针指向。
在这里插入图片描述
也可以用算法库中的逆置,但是二者的实现原理是不一样的。
在这里插入图片描述

我这里测试1000000个数的逆置,结果如下:
在这里插入图片描述
所以说,还是用自带的reverse好。

sort

库中也有个sort,这里也有个sort。
但是二者效率不一样。

算法库中sort只能对连续空间的元素进行排序。因为sort底层用的是快排,有三数取中的优化,但是三数去中需要我们能够找到中间的值,而list想要找到中间值的话会非常麻烦,效率就会大大降低,但是若快排没有三数去中的话,当元素已经有序时,就会出大问题,时间复杂度会直接变为N^2的。

所以链表不能用算法库中的sort,只能用list提供的sort,而list提供的sort底层用的是归并排序。

N个数据需要排序,vector + 算法库中的sort快,还是list + 自带的sort快?
答案是vector + 算法库中的sort快。

我们用代码测试一下:(用release版

void test_op()
{
	srand(time(0));
	const int N = 100000;
	vector<int> v;
	v.reserve(N);
	
	list<int> lt2;

	for (int i = 0; i < N; ++i)
	{
		auto e = rand();
		v.push_back(e);
		lt2.push_back(e);
	}

	int begin1 = clock();
	sort(v.begin(), v.end());
	int end1 = clock();

	int begin2 = clock();
	lt2.sort();
	int end2 = clock();

	printf("vector sort:%d\n", end1 - begin1);
	printf("list sort:%d\n", end2 - begin2);
}

一百万个数:
在这里插入图片描述
可以看到vector + 算法库的sort速度还是比较快的。

现在我们用两个相同的list,一个用自带的sort,一个将所有的数拷贝到vector中再用拷贝后的vector加上算法库中的sort来排序,然后再把vector中的数拷贝到list中。

测试代码如下:

void test_op()
{
	srand(time(0));
	const int N = 100000;
	vector<int> v;
	v.reserve(N);

	list<int> lt1;
	list<int> lt2;

	for (int i = 0; i < N; ++i)
	{
		auto e = rand();
		lt1.push_back(e);
		lt2.push_back(e);
	}


	int begin1 = clock();
	// 拷贝到vector排序,排完以后再拷贝回来
	for (auto e : lt1)
	{
		v.push_back(e);
	}
	sort(v.begin(), v.end());
	size_t i = 0;
	for (auto& e : lt1)
	{
		e = v[i++];
	}
	int end1 = clock();

	int begin2 = clock();
	lt2.sort();
	int end2 = clock();

	printf("copy vector sort:%d\n", end1 - begin1);
	printf("list sort:%d\n", end2 - begin2);
}

同样是一百万个数,结果为:
在这里插入图片描述

可以看到,仍然比list自带的sort好的多。
那么可以说list库中给的sort基本上是废的,vector支持随机访问效率就会高上特别多。

那么当数据量大时,不如将list的数据拷贝到vector中,再用vector排序,速度都比list中的sort快好几倍。

merge

将两个有序链表合并,合并后的链表依然有序。

用这个前提是链表得有序。
在这里插入图片描述
如果有无序的,结果就是无序:
在这里插入图片描述

好了,该讲的都讲了,有不会的自行查文档即可。

到此结束。。。

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

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

相关文章

QT ui_xxx.h: no such file or directory”

使用QT新建子窗口后,编译无法通过 mainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl labelwindow::labelwindow(class QWidget *)" (??0labelwindowQEAAPEAVQWidgetZ)&#xff0c;该符号在函数 "private: void __cdecl MainWindow::o…

android studio 添加并读取json配置文件

第一步&#xff1a;在android studio中添加json文件&#xff1b; 第二步&#xff1a;读取文件的函数 private String[] getJosnData(){String result[] null;List<String> list new ArrayList<>();try {//获取本地的Json文件AssetManager assetManager mConte…

界面控件DevExtreme v23.1新版亮点 - 全新的DateRangeBox组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

【Qt】 自定义列表控件

一、效果图 二、思路 先实现单个item控件&#xff0c;之后根据所需个数new出来插入布局中。item过多时支持滑动操作&#xff0c;可以把item放入scrollArea中&#xff0c;如需实现滑动效果可以使用eventFilter&#xff0c;计算坐标配合scrollArea->verticalScrollBar()->…

2023数字化转型研讨会:RockPlus MOM系统引领制造业变革

7月13日在淄博张店举办的2023年企业数字化转型研讨会上&#xff0c;RockPlus MOM制造运营系统闪耀登场&#xff0c;凭借其将精益生产与信息化相结合的理念&#xff0c;成为会议的一大焦点。该系统是由合共软件精心打造的&#xff0c;目标在供应链管理(SRM)、仓储物流(WMS)、计划…

这么多计算机语言该怎么选

这么多计算机语言该怎么选 选择哪种计算机语言取决于你的需求和目标。以下是一些考虑因素&#xff1a; 你想用语言做什么&#xff1a;首先&#xff0c;你需要确定你的语言选择将主要用于什么目的。是为了编写Web应用程序、移动应用程序、桌面应用程序还是其他类型的应用程序&…

密码学学习笔记(十):Digital Signatures - 数字签名2

ElGamal 签名 密钥生成&#xff1a;随机选取&#x1d465;, 设置&#x1d466; 签名&#xff1a;选一个随机的k&#xff0c;gcd (&#x1d458;, &#x1d45d; − 1) 1 认证&#xff1a;给与一个签名&#x1d70e; (&#x1d45f;, &#x1d460;), 检查它是否满足 工作原…

Java设计模式之行为型-命令模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 1、基本实现 2、点餐案例 五、总结 一、基础概念 1、将一个请求封装为一个对象&#xff0c;使您可以用不同的请求对客户进行参数化。 2、对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 3、…

赛效:如何在线将多图合为GIF动图

1&#xff1a;点击多图合成GIF。 2&#xff1a;点击页面中间的上传按钮&#xff0c;将图片上传到页面上去。 3&#xff1a;动图参数调整好后&#xff0c;点击下方“生成GIF并下载”&#xff0c;就可以将GIF文件保存到电脑本地了。 如果你想了解更多办公软件及其对应的使用教程&…

.net core 2.1 简单部署IIS运行

netcore的项目不像netFramework那么方便部署到iis还是要费点功夫的 比如我想把这个netcore2.1的项目部署到iis并运行&#xff1a; 按照步骤走&#xff1a; 一、确认自己的netcore环境 1、需要安装下面3个环境包(如果电脑已安装请忽略) 检查是否安装cmd命令&#xff1a;cmd&…

这么看,项目经理根本不可能失业

早上好&#xff0c;我是老原。 不知道做项目经理的朋友们有没有这种感觉&#xff0c;明明项目经理是一个高大上的管理岗位&#xff0c;但为何总觉得自己的工作是一个打杂的&#xff1f; 最近就有一个粉丝朋友来和我吐槽&#xff1a;明明是升职&#xff0c;为啥感觉被坑了。 …

Bard!谷歌对 ChatGPT 的最强反击,悄咪咪的支持中文了!

“ ChatGPT、Bard&#xff0c;哪个是更好的AI人工智能大语言模型。” 01 — ChatGPT 这么火&#xff0c;而且这款产品是 OpenAI 以谷歌的大模型架构 transformer 为基础迭代的。谷歌自然不甘落后&#xff0c;早在3月份推出自家的人工智能大语言模型 Bard&#xff0c;只是当时还…

学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

Drools用户手册翻译——第三章 构建,部署,应用和运行(五)可执行规则模型

这应该是Drools的新东西&#xff0c;我之前使用的时候都没注意到还有这么一个东西&#xff0c;据说是可以让Drools变得更高更快更强&#xff0c;这里面有比较详细的介绍&#xff0c;感兴趣就去来看看。 甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&…

N天爆肝数据库——MySQL(4)

本篇文章&#xff0c;主要对多表查询&#xff0c;事务以及体系结构进行知识总结和学习。 期待和大家一起学习进步。标量子查询 子查询返回的结果是单个值&#xff08;数字、字符串、日期等&#xff09;&#xff0c;最简单的形式&#xff0c;这种子查询称标量子查询。常用的操作…

面试题更新之-DOCTYPE html相关问题

文章目录 <!DOCTYPE html>是什么&#xff1f;为什么要在html文件开头加上一个<!DOCTYPE html>DOCTYPE的作用&#xff0c;严格与混杂模式的区别&#xff0c;有何意义HTML5为什么只需要写<!DOCTYPE HTML> 是什么&#xff1f; 是HTML文档的文档类型声明&#xf…

SpringSecurity--权限管理架构介绍

目录 介绍 认证 授权 解决⽅案 Shiro 开发者⾃定义 Spring Security 整体架构 认证 AuthenticationManager&#xff08;认证管理器&#xff09; Authentication SecurityContextHolder 授权 AccessDecisionManager AccessDecisionVoter ConfigAttribute 总结 …

Python在安装包时出现ValueError: check_hostname requires server_hostname和Read timed out

一、ValueError: check_hostname requires server_hostname 出现这个问题基本上是因为开了vpn等网络代理软件造成&#xff0c;关掉代理软件即可解决。 二、Read timed out 在安装python包的时候&#xff0c;出现 Read timed out. 尽管添加了镜像源头py.ini&#xff0c;也添加…

游戏程序员的核心竞争力是什么?

看了题主的描述。你的心迷离&#xff0c;仿佛躲避着梦想的曙光&#xff0c;然而在那一片昏暗的迷雾背后&#xff0c;隐藏的不过是懒散的借口。 编程技能 编程语言掌握&#xff1a; C&#xff1a;C是游戏开发中最常用的编程语言之一。了解C的核心语法、面向对象编程和泛型编程…