c++ -- STL容器--list容器

news2024/11/25 20:52:06

7. list容器

7.1 简介

① 功能:将数据进行链式存储。

② 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

③ 链表的组成:链表由一系列结点组成。

④ 结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

⑤ 添加元素,将原指向下一个元素的指针指向新元素即可,新元素指向下一个元素

⑥ STL中的链表是一个双向循环链表。

  1. 双向:每一个指针既指向下一个结点的元素,也指向上一个结点的元素。

  1. 循环:最后一个结点的指针会指向第一个结点的元素,第一个结点的指针会指向最后一个结点的元素。

⑦ 由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。

  1. 它只能通过指针域一个一个前移/后移去找,而不能连续的内存空间,指针加一个数字,就可以找到数据。

⑧ list的优点:

  1. 采用动态存储分配,不会造成内存浪费和溢出。

  1. 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量数据。

⑨ list的缺点:

  1. 链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大。

10.list有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector中是不成立的,vector当插入操作会创建一个更大的数据内容,而vector容器的迭代器却指向原有内存,所以原有的vector容器失效了。

11.STL中list和vector是两个最长被用的容器,各有优缺点。

7.2 构造函数

① 功能描述:创建list容器。

② 函数原型:

  1. list lst; //list采用模板类实现对象的默认构造形式

  1. list(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身。

  1. list(n,elem); //构造函数将n个elem拷贝给本身。

  1. list(const list &lst); //拷贝构造函数。

③ list构造方式同其他几个STL容器一样。

运行结果:

  • 10 20 30 40

  • 10 20 30 40

  • 10 20 30 40

  • 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000

  • 请按任意键继续. . .

7.3 赋值和交换

① 功能描述:给list容器进行赋值,以及交换list容器。

② 函数原型:

  1. assign(beg,end); //将[beg,end)区间中的数据拷贝赋值给本身。

  1. assign(n,elem); //将n个elem拷贝赋值给本身。

  1. list& operator=(const list &list); //重载等号操作符。

  1. swap(list); //将lst与本身的元素互换。

运行结果:

  • 10 20 30 40

  • 10 20 30 40

  • 10 20 30 40

  • 100 100 100 100 100 100 100 100 100 100

  • 交换前:

  • 10 20 30 40

  • 100 100 100 100 100 100 100 100 100 100

  • 交换后:

  • 100 100 100 100 100 100 100 100 100 100

  • 10 20 30 40

  • 请按任意键继续. . .

7.4 大小操作

① 功能描述:对list容器的大小进行操作。

② 函数原型:

//返回容器中元素的个数。

  1. size();

//判断容器是否为空。

  1. empty();

//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(num);

//重新指定容器的长度为num,若容器变成,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(num,elem);

运行结果:

  • 10 20 30 40

  • L1不为空:

  • L1的元素个数为:4

  • 10 20 30 40 10000 10000 10000 10000 10000 10000

  • 10 20

  • 请按任意键继续. . .

7.5 插入和删除

① 功能描述:对list容器进行数据的插入和删除。

② 函数原型:

  1. push_back(elem); //在容器尾部加入一个元素。

  1. pop_back(); //删除容器中最后一个元素。

  1. push_front(elem); //在容器开头插入一个元素。

  1. pop_front(); //从哪个容器开头移除第一个元素

  1. insert(pos,elem); //在pos位置插elem元素的拷贝,返回新数据的位置。

  1. insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

  1. insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

  1. clear(); //移除容器的所有数据。

  1. erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

  1. erase(pos); //删除pos位置的数据,返回下一个数据的位置。

  1. remove(elem); //删除容器中所有与elem值匹配的元素。

运行结果:

  • 300 200 100 10 20 30

  • 300 200 100 10 20

  • 200 100 10 20

  • 200 1000 100 10 20

  • 1000 100 10 20

  • 1000 100 10 20 10000 10000 10000 10000

  • 1000 100 10 20

  • 请按任意键继续. . .

7.6 数据存取

① 功能描述:对list容器中数据进行存取。

② 函数原型:

  1. front(); //返回第一个元素。

  1. back(); //返回最后一个元素。

③ list容器不是连续的内存空间,所以不能通过[]、at等方式随机访问。

运行结果:

  • 第一个元素为:10

  • 第一个元素为:40

  • 请按任意键继续. . .

7.7 反转和排序

① 功能描述:将容器中的元素反转,以及将容器中的数据进行排序。

② 函数原型:

  1. reverse(); //反转链表

  1. sort(); //链表排序

运行结果:

  • 反转前:

  • 20 10 50 40 30

  • 反转后:

  • 30 40 50 10 20

  • 排序前:

  • 30 40 50 10 20

  • 排序后:

  • 10 20 30 40 50

  • 重载排序算法,降序排序后:

  • 50 40 30 20 10

  • 请按任意键继续. . .

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

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

相关文章

serverless论文总结

1.Benchmarking, Analysis, and Optimization of Serverless Function Snapshots https://zhuanlan.zhihu.com/p/572288442 这项工作引入了vHive,一个针对无服务器实验的开源框架,它使系统研究人员能够在整个无服务器堆栈中进行创新。vHive集成了来自领…

ITSM | 权威指南发布,高速IT服务管理团队是什么样子的?

当Netflix正在打造流媒体平台时,还有人在营业厅里为一张网卡而烦恼。当Craig Newmark创建免费分类广告网站时,报社的网络管理员最关心的还是重启电子邮件服务器。当数字化转型成为一道必答题,谁能率先给出解题之法? 阅读本篇文章&…

Input子系统

文章目录前言Input子系统简介Input子系统代码实现框架Linux Input子系统支持的数据类型input核心层设备驱动层input_allocate_device 与 函数input_set_capabilityinput_register_device 函数input_unregister_device 与 input_free_device 函数事件处理层input_attach_handler…

A. Divide and Conquer

An array bb is good if the sum of elements of bb is even. You are given an array aa consisting of nn positive integers. In one operation, you can select an index ii and change ai:⌊ai2⌋ai:⌊ai2⌋. †† Find the minimum number of operations (possibly 00)…

ArcGIS 切片问题小结

1. 如果发布的切片缓存服务没有自动启动怎么办? 在进行切片时偶然情况下可能会遇到,你在切片时已经设置了server自动进行切片处理,但是在服务发布后,服务发布成功,但是服务没有成功启动,导致服务器没有自动…

免费数据恢复方法有哪些?分享这几种简单又实用的恢复方法(2023年最新)

很多时候,我们使用电脑总是容易误删一些数据。比如使用电脑,误删了办公资料;使用SD卡,出现照片没有办法打开的情况;使用移动硬盘,出现文档误格式化等问题。 不必要的数据被删除那就没问题,如果…

Java反序列化—Fastjson基础

0x01 前言 最近摆烂了很久,来学习一下fastjson 0x02 Fastjson 简介 Fastjson 是 Alibaba 开发的 Java 语言编写的高性能 JSON 库,用于将数据在 JSON 和 Java Object 之间互相转换。 提供两个主要接口来分别实现序列化和反序列化操作。 JSON.toJSONStr…

socket应用之从电脑发送图片到手机(1)之通信过程建立

本人曾经做了一个基于MPVd的C#开发的播放器,用于自娱自乐,后来又用websocket 写了个简单的远程控制器。由于websocket 要依赖于浏览器,因此有诸多不便,后来又用flutter写了一个,方便多了。 下面介绍具体实现。 1、通信…

RabbitMQ 消息持久化

RabbitMQ 消息持久化 持久化是为提高rabbitmq消息的可靠性,防止在异常情况(重启,关闭,宕机)下数据的丢失。设置完队列和消息的持久化,并不能完全保证消息不会丢失。尽管它告诉 RabbitMQ 将消息保存到磁盘,但当 Rabbit…

mapbox-gl添加threejs飞线

文章目录前言飞线实现1 初始化地图并加载three图层2 绘制飞线几何体将几何体正确定位在mapbox上正确操作BufferGeometry几何体3 tween实现动画全部代码总结待改进之处参考前言 mapbox-gl是一个基于webgl开发的三维地图渲染引擎,但是很多三维特效只用mapbox并不容易…

【CSDN 年终总结】CSDN的进阶之路—— “1+1=王”的2022总结

正文之前打个广告,我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励。⭐ ⭐ ⭐ ⭐ ⭐https://bbs.csdn.net/topics/611386885?spm1001.2014.3001.6953 2022我在CSDN 2022 在CSDN是持续输出,持续…

TinyPng图片压缩的正确打开方式

https://tinypng.com/ TinyPNG使用智能的「有损压缩技术」来减少WEBP、JPEG和PNG文件的文件大小。通过选择性地减少图像中的「颜色数量」,使用更少的字节来存储数据。这种效果几乎是看不见的,但在文件大小上有非常大的差别。 使用过TinyPNG的都知道&…

MyBatis 万字长文:从入门到动态SQL超详细

文章目录1. 前言2. 创建项目3. 添加框架支持4. 建库5. 配置数据库连接信息和 XML 文件路径5.1 创建 Java 类5.2 Java 接口5.3 XML 文件6. 查询6.1 不带参数的查询6.2 单元测试6.3 带参数的查询7. 修改8. 增加8.1 将对象插入表中8.2 获取自增主键9. 删除10. 数据库字段和类属性名…

Video2StyleGAN: Disentangling Local and Global Variations in a Video翻译

点击下载论文 代码地址 摘要 使用预训练的StyleGAN生成器进行图像编辑已成为面部编辑的强大范例,它提供了对年龄、表情、照明度等的解纠缠控制。然而,该方法不能直接用于视频操作。我们认为主要因素是缺乏对面部位置、面部姿势和局部面部表情的精细和清…

腾讯云-云服务器购买流程-Java项目部署(详细的一批)

文章目录云服务器购买云服务搭建部署环境宝塔面板使用(安装所需环境)部署SpringBoot项目出现Error: Unable to access jarfile /www/wwwroot/xxxx.jar--server.port6066 问题解决腾讯云COS有什么用?如果感觉有用就一键三连吧,创作…

Electron 实现切换暗_亮模式与主题

文章末尾附上仓库地址!!!! 清单 模板基于 electron-vite-vue vue3 ts vite组件库 element-plushooks库 vueuse 、useElementPlusTheme 初始化工程 使用 electron-vite 作为模板,方便大家尽快吧项目跑起来 # 创建模…

Java面试之数据库篇

一、基础 1.数据库事务的特征ACID 原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用…

UOS服务器操作系统多版本Java切换

一、修改java的环境变量和软链接来实现版本切换 1、配置环境变量 sudo vim ~/.bashrc 2、创建java运行程序软连接 3、使配置生效,并检查java版本 source /etc/profile 二、使用update-alternatives 进行版本的切换 1、同时安装了openjdk-8-jdk 和…

shell第七天作业——awk

题目 1、获取根分区剩余大小 2、获取当前机器ip地址 3、统计出apache的/var/log/httpd/access_log文件中访问量最多的前3个IP 4、打印/etc/passwd中UID大于500的用户名和uid 5、/etc/passwd 中匹配包含root或sys或tcp的任意行 6、请打印出/etc/passwd 第一个域&#xff0…

指针进阶之数组参数和指针参数

文章目录一、回顾1.字符指针2.指针数组和数组指针(1)指针数组(2)数组指针二、数组参数1.一维数组传参(1)整型数组(2)指针数组(3)总结2.二维数组传参&#xff…