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 …

Android Jetpack组件的全方位分析

Jetpack是一个用于简化Android应用程序开发的工具包&#xff0c;包含了一系列的组件和工具。Jetpack包含了很多组件&#xff0c;如LiveData、ViewModel、Room、Data Binding、Navigation等。 Jetpack组件是一种更高级别的抽象&#xff0c;它们可以提供更简洁、更易于使用的API。…

self instruct 介绍

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

在 React 中如何使用定时器

在React中使用定时器通常有两种方式&#xff1a;使用setInterval和setTimeout函数。 使用setInterval函数&#xff1a; 首先&#xff0c;在组件中导入useEffect和useState函数&#xff1a; import React, { useEffect, useState } from "react";在组件中声明一个状…

ES6-简介、语法

ES6 ES6简介 ​ ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语…

Linux 常用

系统信息 查看CPU信息&#xff08;型号&#xff09; cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c查看物理CPU个数 cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo | grep "c…

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 的核心思想是在图卷积层之间引…

CUDA和C++混合编程及CMakeLists.txt

1. 概要 首先认识一个问题&#xff0c;单从CMakeLists.txt的角度来看&#xff0c;无法同时使用两种编译器编译两种语言。不过直接编写Makefile是可以的&#xff0c;通过设置不同的任务&#xff0c;可以实现一个Makefile编译两个语言。但这不是这里要讨论的重点。 使用CUDA和C进…

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。…

js中的解构赋值

在JavaScript中&#xff0c;解构赋值是一种方便地从数组或对象中提取值并赋给变量的方法。 它允许你使用一种简洁的语法来快速访问和使用数据。 对于数组解构赋值&#xff0c;你可以使用方括号&#xff08;[]&#xff09;来指定变量名&#xff0c;并将其放在赋值语句的左侧。例…

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…

mongodb和redis的用途

MongoDB和Redis都是常见的NoSQL数据库&#xff0c;它们有不同的特点和用途。 MongoDB的主要特点和用途&#xff1a; 数据存储&#xff1a;MongoDB是一种面向文档的数据库&#xff0c;以JSON样式的BSON文档&#xff08;二进制JSON&#xff09;的形式存储数据。它支持复杂的数据…