list【1】介绍与使用(超详解哦)

list的介绍与使用

  • 引言
  • list介绍
  • 接口使用
    • 默认成员函数
    • 迭代器
    • 容量
    • 元素访问
    • 数据修改
  • list的算法接口
  • 总结

引言

继vector之后,我们继续来介绍STL容器:list
对于容器的使用其实有着类似的模式,参考之前vector的使用可以让我们更快的上手:
戳我看vector介绍与使用详解哦

list介绍

在之前C语言部分我们就认识了链表,STL中的list是一个双向链表

相对于vector的底层空间是连续的,list的底层空间是通过指针链接的链状的不连续的空间
这样的结构相较连续空间扩容更加方便:不需要重开空间移动数据,只需要在开辟一个新的结点后,将其与前面的结点链接起来即可。其在任意位置插入删除都不需要挪动数据,效率较高:只需要释放或增加对应结点的数据,然后将剩下的结点链接起来即可;
相较于vector,list不能实现高效的任意访问其中的元素,要随机访问元素只能从头或尾遍历访问,效率较低。所以list中也就直接没有实现operator[]

所以,list适用于需要经常在任意位置插入删除大量数据,且不需要经常访问任意位置元素的数据的存储
list是一个类模板,可以支持存储任意类型:
在这里插入图片描述

接口使用

与vector类似,list也有默认成员函数、迭代器、容量、元素访问、数据修改等接口(使用库list时需要包含头文件#include<list>

默认成员函数

构造
在这里插入图片描述
list的构造函数重载了4个版本,支持无参构造、n个指定元素构造、迭代器区间构造以及拷贝构造。迭代器区间构造是一个函数模板,即可以使用任一InputIterator迭代器区间来构造list。

使用时与vector类似,由于list是一个类模板,所以在使用list来实例化对象是,就需要显式指定模板参数,如list<int>

#include<iostream>
#include<list>
#include<vector>
using namespace std;int main()
{list<int> l1; //无参初始化for (auto e : l1){cout << e << " ";}cout << endl;list<int> l2(10, 6);    //使用10个6初始化l2for (auto e : l2){cout << e << " ";}cout << endl;vector<int> v1(10, 5);  //使用10个5初始化v1list<int> l3(v1.begin(), v1.end());  //使用迭代器区间初始化for (auto e : l3){cout << e << " ";}cout << endl;list<int> l4(l3); //拷贝构造for (auto e : l4){cout << e << " ";}cout << endl;
}

在这里插入图片描述

析构
在这里插入图片描述
析构函数会在list对象生命周期结束时由编译器自己调用,以释放其内部资源。

赋值重载
在这里插入图片描述
l2赋值给l1

int main()
{list<int> l1;for (auto e : l1){cout << e << " ";}cout << endl;list<int> l2(10, 6);for (auto e : l2){cout << e << " ";}cout << endl;l1 = l2;  //将l2赋值给l1for (auto e : l1){cout << e << " ";}cout << endl;
}

在这里插入图片描述

迭代器

在这里插入图片描述
vector的迭代器的底层就是原生指针,与vector不同,list的迭代器是指针的封装(在list实现时会详细介绍),但是在使用list迭代器时是与vector几乎一致的。
但是需要注意的是,list的迭代器由于不是原生指针,在+-数字时的成本太高,所以就不支持迭代器+-,只允许迭代器进行++--的双向移动,即为bidirectional iterator

begin返回首元素位置的迭代器,end返回尾元素下一个位置的迭代器、rbegin返回尾元素的反向迭代器、rend返回首元素前一个位置的反向迭代器。后面的cbegincendcrbegincrend都是返回其对应的const迭代器,但是前面的函数都有重载const版本:

int main()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);l1.push_back(5);l1.push_back(6);for (auto e : l1){cout << e << " ";}cout << endl;cout << *l1.begin() << endl;cout << *(--l1.end()) << endl;cout << *l1.rbegin() << endl;cout << *(--l1.rend()) << endl;return 0;
}

在这里插入图片描述

容量

在这里插入图片描述
对于list,没有容量的概念,也就不需要有扩容的操作。
所以在容量部分,list只提供了sizeempty,用于返回list中元素个数与判断list是否为空

int main()
{vector<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);l1.push_back(5);l1.push_back(6);for (auto e : l1){cout << e << " ";}cout << endl;cout << "size:" << l1.size() << " ";cout << "is empty:" << l1.empty() << " ";return 0;
}

在这里插入图片描述

元素访问

在这里插入图片描述
list不是连续的空间,想要通过下标访问任意位置的元素时成本较高,所以list没有重载operator[],而只能通过迭代器访问元素;
同时,list提供了frontback接口来实现对首尾元素的访问

int main()
{vector<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);l1.push_back(5);l1.push_back(6);for (auto e : l1){cout << e << " ";}cout << endl;cout << l1.front() << endl;cout << l1.back() << endl;return 0;
}

在这里插入图片描述

数据修改

在这里插入图片描述
与vector类似

push_frontpush_back用于在头、尾插入一个元素;
pop_frontpop_back用于在头、尾删除一个元素;

int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_front(4);l.push_front(5);l.push_front(6);for (auto e : l){cout << e << " ";}cout << endl;l.pop_back();l.pop_front();for (auto e : l){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述
insert用于在pos位置(迭代器位置)插入一些数据,包括单个元素、多个指定元素以及一个迭代器区间中的元素:

int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);l.push_back(6);for (auto e : l){cout << e << " ";}cout << endl;l.insert(l.begin(), 10);  //相当于头插一个10l.insert(l.begin(), 3, 20);  //相当于头插3个20list<int> l2(3, 30);  //使用3个30构造l2l.insert(l.end(), l2.begin(), l2.end()); //相当于尾插一个l2for (auto e : l){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述
erase用于删除pos位置的一个元素或一个迭代器区间中的元素

int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);l.push_back(6);l.erase(++l.begin(), --l.end());for (auto e : l){cout << e << " ";}cout << endl;l.erase(l.begin());  //相当于头删for (auto e : l){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述
resize用于修改list中的容量:
n小于list的元素个数时,就删除至n个元素;
n大于list的元素个数时,就用指定元素value补足:

int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);l.push_back(6);for (auto e : l){cout << e << " ";}cout << endl;l.resize(3);  //删至3个元素for (auto e : l){cout << e << " ";}cout << endl;l.resize(10, 6); //补到10个元素,不足的用6补for (auto e : l){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

swap用于交换两个list中的数据
clear用于清理list中的数据,这里就不再演示了。

list的算法接口

在这里插入图片描述
同时,list还提供了一些算法接口,如reversesort等。

  1. 对于reverse算法库中的接口,是通过循环左右交换的方式来实现的:
    在这里插入图片描述
    对于list这样,通过逻辑连续的线性结构,我们可以使用更为简单的改变链接顺序的方法来实现反转,list的算法中就是这样实现的(戳我看反转链表OJ 思路与该算法类似)

  2. 对于算法库中sort的接口,使用的是快排的方式来排序的,快排算法是需要三数取中来优化的,即他需要能够+-RandomAccessIterator迭代器作为参数:
    在这里插入图片描述
    而list的迭代器却不支持+-的操作,所以不能使用算法库中的sort函数,所以list提供了这个接口。
    但是list中的sort函数效率远没有快排的效率高,所以在进行大量list数据的排序时,可以将其数据转移到vector中排序后再转移回来;也可以干脆不适用list来存储需要大量排序的数据

总结

到此,关于list的简介与接口使用就介绍完了
接下来会进行模拟实现,欢迎持续关注哦

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

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

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

相关文章

【MySQL】2、MySQL数据库的管理

常用 describe user; Field:字段名称 Type:数据类型 Null :是否允许为空 Key :主键 Type:数据类型 Null :是否允许为空key :主键 Default :默认值 Extra :扩展属性&#xff0c;例如:标志符列&#xff08;标识了种子&#xff0c;增量/步长&#xff09;1 2 id&#xff1a;1 3 5 …

self instruct 介绍

《SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions》 github: self-instruct 背景 大模型表现惊人&#xff0c;但是严重依赖于人工编写的指令数据。然而&#xff0c;依靠人工标注数据成本高昂。本文中提出self-instruct框架&#xff1a;一种基于大…

Android创建签名文件,并获取签名文件MD5,SHA1,SHA256值

一、创建Android签名文件 使用Android Studio开发工具&#xff0c;可视化窗口进行创建 第一步&#xff1a;点击AndroidStudio导航栏上的 Build→Generate Signed Bundle / APK 第二步&#xff1a;选择APK选项 第三步&#xff1a;创建签名文件 第四步&#xff1a;输入创建签名的…

如何五分钟设计制作自己的蛋糕店小程序

在现如今的互联网时代&#xff0c;小程序已成为企业推广和销售的重要利器。对于蛋糕店来说&#xff0c;搭建一个小程序可以为其带来更多的品牌曝光和销售渠道。下面&#xff0c;我们将以乔拓云平台为例&#xff0c;来教你如何从零开始搭建自己的蛋糕店小程序。 首先&#xff0c…

2023/8/27周报

目录 摘要 论文阅读 1、标题和现存问题 2、过度平滑和度量方法 3、处理过坡 4、实验结果 深度学习 1、解决可视化问题 2、CART算法 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇Pairnorm:解决GNNS中的过平滑问题的论文。PairNorm 的核心思想是在图卷积层之间引…

7 集群基本测试

1. 上传小文件到集群 在hadoop路径下执行命令创建一个文件夹用于存放即将上传的文件&#xff1a; [atguiguhadoop102 ~]$ hadoop fs -mkdir /input上传&#xff1a; [atguiguhadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/work.txt /input2.上传大文件 [atguiguhadoop1…

Vue 3 常见面试题汇总

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 前言 最近两年许多大厂都在实行“降本增效”、“优化组织架构”&#xff0c;然后“为社会输送了大量人才”&#xff0c;今年&#xff08;2023&#xff…

视频云存储/安防监控视频智能分析网关V3:占道经营功能详解

违规占道经营者经常会在人流量大、车辆集中的道路两旁摆摊&#xff0c;导致公路交通堵塞&#xff0c;给居民出行的造成不便&#xff0c;而且违规占路密集的地方都是交通事故频频发生的区域。 TSINGSEE青犀视频云存储/安防监控视频/AI智能分析网关V3运用视频AI智能分析技术&…

10万字智慧政务大数据平台项目建设方案222页[Word]

导读&#xff1a;原文《10万字智慧政务大数据平台项目建设方案222页[Word]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 1.1 项目建设目标 推进市一级政府搭建数…

求生之路2社区服务器sourcemod安装配置搭建教程centos

求生之路2社区服务器sourcemod安装配置搭建教程centos 大家好我是艾西&#xff0c;通过上文我们已经成功搭建了求生之路2的服务端。但是这个服务端是纯净的服务端&#xff0c;就是那种最纯粹的原版。如果想要实现插件、sm开头的命令等功能&#xff0c;需要安装这个sourcemod。…

opencv 案例实战02-停车场车牌识别SVM模型训练及验证

1. 整个识别的流程图&#xff1a; 2. 车牌定位中分割流程图&#xff1a; 三、车牌识别中字符分割流程图&#xff1a; 1.准备数据集 下载车牌相关字符样本用于训练和测试&#xff0c;本文使用14个汉字样本和34个数字跟字母样本&#xff0c;每个字符样本数为40&#xff0c;样本尺…

家政服务行业搭建小程序的实用技巧分享

随着移动互联网的发展&#xff0c;小程序成为了各行各业的新宠。对于家政服务行业来说&#xff0c;搭建一个小程序商城可以极大地提升服务的便捷性和用户体验&#xff0c;同时也能提高企业的竞争力。本文将分享家政服务行业搭建小程序的实用技巧&#xff0c;帮助您顺利创建属于…

Docker 常用服务 安装使用 教程

Docker安装常用服务 1、 安装mysql # 1.拉取mysql镜像到本地 docker pull mysql:tag (tag不加默认最新版本) # 2.运行mysql服务 docker run --name mysql -e MYSQL_ROOT_PASSWORDroot -d mysql:tag --没有暴露外部端口外部不能连接 docker run --name mysql -e MYSQL_ROOT_PAS…

HTML+CSS 查漏补缺

目录 1&#xff0c;HTML1&#xff0c;尺寸的百分比1&#xff0c;普通元素2&#xff0c;绝对&#xff08;固定&#xff09;定位元素3&#xff0c;常见百分比 2&#xff0c;form 表单元素1&#xff0c;form2&#xff0c;button3&#xff0c;label4&#xff0c;outline5&#xff0…

uni.uploadFile上传 PHP接收不到

开始这样&#xff0c;后端$file $request->file(file);接收不到 数据跑到param中去了 去掉Content-Type&#xff0c;就能接收到了 param只剩下

Matlab(基本操作与矩阵输入)

目录 1.Matlab视窗详读 2.基本操作与矩阵输入 2.1 运算符的优先级 2.2 初等数学函数 2.3 嵌入函数 2.4 特殊变量和常量 2.5 Matlab的优先级调用 2.6 数字显示格式长 2.7 命令行中端 2.8 部分函数 2.9 向量和矩阵 2.10 数组索引 2.11 串联矩阵 2.12 生成数值序列 …

云LIS云实验室信息管理系统源码,支持IIS独立部署,Docker部署

云LIS技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等。 云LIS系统是医院信息管理的重要组成部分之一&#xff0c;它是一个基于B/S架构开发的实验室信息管理系统。整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件&#xff0c;有外…

AxureRP制作静态站点发布互联网,内网穿透实现公网访问

AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问 文章目录 AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4…

【C++】C++ 引用详解 ⑧ ( 普通引用与常量引用 | 常量引用概念与语法 )

文章目录 一、普通引用1、概念说明2、代码示例 - 普通引用 二、常量引用1、常量引用引入2、常量引用概念与语法2、代码示例 - 常量引用不可修改 一、普通引用 1、概念说明 之前的 【C】C 引用详解 ① ~ ⑦ 博客中 , 讲解的都是 普通引用 , 也就是 将 普通变量 赋值给 引用 , 过…

微信开发之一键创建微信群聊的技术实现

创建微信群 本接口为敏感接口&#xff0c;请查阅调用规范手册创建后&#xff0c;手机上不会显示该群&#xff0c;往该群主动发条消息手机即可显示。 请求URL&#xff1a; http://域名地址/createChatroom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-…