C++STL的list(超详解)

news/2024/6/18 21:40:47 标签: c++, list, 开发语言

文章目录

  • 前言
    • 构造函数
    • capacity
    • list的访问
    • insert
    • swap
    • sort

前言

在这里插入图片描述
看一下list, 在任意位置可以进行O(1)插入删除的操作。
它怎么实现这个东西?它其实就是一个带头双向循环链表。

#成员函数

构造函数

在这里插入图片描述
这里面的构造函数学完string和vector之后已经相当熟悉了。

capacity

在这里插入图片描述
它没有resize和reserve,为什么?
它没有扩容这个玩法,它是链表。

list_18">list的访问

链表和vector、string的最大区别是什么?
它不支持【】,不能像数组一样访问。

list严格来说,要遍历和修改它,就只有一种方式,迭代器。
在这里插入图片描述

insert

在这里插入图片描述

list和vector一样,没有提供它自己的find
在这里插入图片描述

swap

把链表的头指针机型交换就可以了。

sort

sort很值得仔细讲一下

为什么算法库提供了一个sort,list它还要自己提供一个sort?
最主要的是算法库提供的sort,list用不了。

看算法库里面的sort做了什么事情。
在这里插入图片描述
这块减的时候出问题了。
算法库里面的sort是用快排实现的,快排要解决最坏的问题,就要用分数取中。
有左边和右边,直接算出中间的位置进行访问,链表不行。

在这里插入图片描述
迭代器的类型跟什么有关系呢?
跟容器的底层结果有关。

从功能上来说,迭代器的类型分三种。

1.单向迭代器,只能++ 不能- - ,比如单链表
2.双向迭代器,可以++, - -,比如双向链表。
3.随机迭代器,可以++,- -,+,-,比如vector, string.

要求双向可以传随机。要求单向可以传双向。
你可以认为双向是一个特殊的单向,随机也是一个特殊的单向。

基于上述的原因,也就明白list为什么有一个单独的sort.
不过链表在90%的情况下都不会用这个sort,因为它的性能不行。

list提供的sort底层用的是归并排序,归并排序本身效率也不错,但是由于种种原因。
给大家测试一下。

list当中同样的数据,一个放到直接用list提供的sort进行排序,
另一个拷贝到vector然后进行排序,最后拷贝回去。
比较一下这两者之间的效率。
在这里插入图片描述

差距还是很大的。
在这里插入图片描述


http://www.niftyadmin.cn/n/5256634.html

相关文章

Docker中安装并配置阿里巴巴的Sentinel控制台

要在Docker中安装并配置阿里巴巴的Sentinel控制台,您可以遵循以下步骤: 下载Sentinel镜像: 使用Docker拉取Sentinel的最新镜像。您可以使用以下命令来完成这一步骤: docker pull bladex/sentinel-dashboard运行Sentinel容器: 创建并运行一个S…

使用Java将图片添加到Excel的几种方式

1、超链接 使用POI&#xff0c;依赖如下 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>Java代码如下,运行该程序它会在桌面创建ImageLinks.xlsx文件。 …

monaco报错#Unexpected usage at EditorSimpleWorker.loadForeignModule

场景 升级monaco版本&#xff0c;和vue-cli版本&#xff0c;打开.ts后缀的文件&#xff0c;报错 解决 在vue.config.js文件中&#xff0c;添加 chainWebpack(config) {config.plugin("monaco").use(new MonacoWebpackPlugin());},module.exports {...configureW…

Vue router深入学习

Vue router深入学习 一、单页应用程序介绍 1.概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 2.具体示例 单页应用网站&#xff1a; 网易云音乐 https://music.163.com/ 多页应用网站&#xff1a;京东 https://jd.co…

FT-2000/4 UEFI编译

安装依赖 sudo apt-get install make-guile sudo apt-get install make gcc bison flex sudo apt-get install build-essential uuid-dev iasl git gcc-5 nasm python3-distutils编译UEFI 进入edk2-for-support文件夹&#xff0c;依次运行以下命令 ./build2004.sh init # de…

【Linux】tar、zip与rar

前言 我解压过无数的文件&#xff0c;却唯独无法解压自己。 tar tar是一个常用的文件打包和归档工具&#xff0c;它在Linux系统中被广泛使用。它的名称"tar"代表"tape archive"&#xff08;磁带归档&#xff09;&#xff0c;最初用于将多个文件和目录打…

MySQL_8.一级索引,二级索引概述

1.一级索引 索引和数据存储在一起&#xff0c;都存储在同一个Btree中的叶子节点。一般主键索引都是一级索引 2.二级索引 二级索引树的叶子节点存储的是主键而不是数据。也就是说&#xff0c;在找到索引后&#xff0c;得到对应的主键&#xff0c;再回到一级索引中找主键对应的数…

python——第十六天

面向对象——继承 class RichMan(object): def __init__(self): self.money 1000000000 self.company "阿里巴巴" self.__secretary "小蜜" def speak(self): print(f"我对钱不感兴趣&#xff0c;我最后悔的事&#xff0c;就是创建了{self.company…