c++提高篇——list容器

news2024/11/28 20:50:20

一、基本概念

功能:将数据进行链式存储
链表((list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的,链表由一系列结点组成。
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指域。
在这里插入图片描述

优点
链表可以对任意位置快速进行插入和删除元素。
缺点
容器遍历速度没有数组快。占用的空间会比数组大,因为数组的数据存放只有数据,而链表分为数据域和指针域,需要存放的内容更多。
STL中的链表是一个双向循环链表:
在这里插入图片描述

之所以称之为双向,是因为STL的指针域中存放的既有前一个节点的地址,又有后一个节点的地址。
而双向节点是因为在传统的链表中,最后一个节点的指针域由于没有下一个节点的地址需要存储,所以就指向为空,而在STL中,第一个节点记录的既有下一个节点的地址,又有链表中最后一个节点的地址,而最后一个节点的地址既有前一个节点的地址,又有开头节点的地址。
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。
list容器的优点
1、采用动态存储分配,不会造成内存浪费和溢出
2、链表执行插入和删除操作十分方便,修改指针即可,不需要移动大品元素
缺点
1、链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大
LIst有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
总结:STL中List和vector是两个最常被使用的容器,各有优缺点。

二、构造函数

list lst;默认构造
list(beg,end) ;构造函数将[beg, end)区间中的元素拷贝给本身。
list(n , elem);构造函数将n个elem拷贝给本身。
list(const list &lst);拷贝构造函数。
样例如vector容器的样例一致,这里就不再举例了。
链接: https://blog.csdn.net/qq_52302919/article/details/129117795

三、赋值和交换

assign(beg, end); 将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elen) ; 将n个elem拷贝赋值给本身。
list& operator=( const list &lst); 重载等号操作符
swap(lst); 将lst与本身的元素互换。
样例如vector容器的样例一致,这里就不再举例了。
链接: https://blog.csdn.net/qq_52302919/article/details/129117795

四、 大小操作

size(); 返回容器中元素的个数
empty(); 判断容器是否为空
resize( num); 重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize( num, elem );重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
样例如vector容器的样例一致,这里就不再举例了。
链接: https://blog.csdn.net/qq_52302919/article/details/129117795

五、插入和删除

push_back(elem); 在容器尾部加入一个元素
pop_back([); 删除容器中最后一个元素
push_front(elem]; 在容器开头插入一个元素
pop_front); 从容器开头移除第一个元素
insert(pos,elem);在pos位置插elem元素的拷贝,返回新数据的位置。insert(pos,n,elem);在pos位置插入n个elem数据。无返回值。
insert(pos,beg,end);在pos位置插入[beg,end)区间的数据,无返回值。
clear(); 移除容器的所有数据
erase(beg,end);删除[beg.end)区间的数据,返回下一个数据的位置。erase(pos);除pos位置的数据,返回下一个数据的位置。
remove(elem);删除容器中所有与elem值匹配的元素。
样例如vector容器的样例一致,这里就不再举例了。
链接: https://blog.csdn.net/qq_52302919/article/details/129117795

六、数据存取

front(); 返回第一个元素。
back(); 返回最后一个元素。
由于链表的存储方式不是在连续的内存中,所以不支持[]、at的读取方式。且list容器的迭代器不支持随机访问,只能进行前移和后移。这与链表的数据存储结构有关。

七、反转和排序

reverse(); 反转链表
sort( ); 链表排序
样例如下:

void printlist(const list<int> &l)
{
	for (list<int>::const_iterator it = l.begin(); it != l.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

bool myCompare(int v1, int v2)
{
	//降序,让第一个数大于第二个数
	return v1 > v2;
}

void test06() {
	list<int> l;
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	printlist(l);

	//反转操作
	l.reverse();
	printlist(l);

	//排序,默认为从小到大
	l.sort();

	//排序,从大到小
	l.sort(myCompare);
	printlist(l);

	//所有不支持随机访问的迭代器的容器不可以用标准算法
	//不支持随机访问迭代器的容器内部会提供一些对应的接口
	//sort(l.begin(), l.end());
}

八、案例

有若干个人,分别有属性:年龄、身高、姓名。首先按照年龄的大小进行排序,如果年龄相同,则按照身高进行降序排序。实现细节如下:

一、实现一个人类

class person
{
public:
	//初始化属性
	person(string name, int age, int height)
	{
		this->M_Age = age;
		this->M_Name = name;
		this->M_Height = height;
	}

	//定义姓名、年龄、身高的属性
	string M_Name;
	int M_Age;
	int M_Height;
};

二、实例出来若干个人,并放入list容器中

	list<person> l;
	//创建出若干个唐僧
	person p1("唐僧", 20, 170);
	person p2("唐僧1", 20, 143);
	person p3("唐僧2", 19, 167);
	person p4("唐僧3", 30, 186);


	//将唐僧放入容器中
	l.push_back(p1);
	l.push_back(p2);
	l.push_back(p3);
	l.push_back(p4);

三、使用sort函数进行排序,这里需要自己用一个仿函数来实现排序规则

bool mycompare(person &p1, person &p2)
{
	//按照年龄做升序
	if (p1.M_Age == p2.M_Age)
	{
		return p1.M_Height > p2.M_Height;
	}
	return p1.M_Age < p2.M_Age;
}
l.sort(mycompare);

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

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

相关文章

3DVR营销是什么?是否成为市场热门?

在当今市场经济环境中&#xff0c;营销对于在企业发展中的作用至关重要。市场是企业发展的战场&#xff0c;谁能在市场营销方面做得更好&#xff0c;就能够吸引公域平台流量、占据主流市场、开拓新局面从而稳定现有规模。这将确保企业不被市场淘汰&#xff0c;而是能够可持续性…

CSS(配合html的网页编程)

续上一篇博客,CSS是前端三大将中其中的一位,主要负责前端的皮,也就是负责html的装饰.一、基本语法规则也就是:选择器若干属性声明(选中一个元素然然后进行属性声明)CSS代码是放在style标签中,它可以放在head中也可以放在body中 ,可以放到代码的任意位置.color也就是设置想要输入…

如何描述元素与元素间的逻辑关系?

逻辑结构反映的是数据元素之间的关系&#xff0c;它们与数据元素在计算机中的存储位置无关&#xff0c;是数据结构在用户面前所呈现的形式。根据不同的逻辑结构来分&#xff0c;数据结构可分为集合、线性结构、树形结构和图形结构4种形式&#xff0c;接下来分别进行简要介绍。 …

宝塔搭建实战php源码云切程序转码m3u8生程序开源源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 今天给大家分享一套php云切片转码的源码&#xff0c;分享自己的视频但是由于视频文件太大&#xff0c;服务器带宽太小&#xff0c;导致分享困难&#xff0c;部署这套系统后&#xff0c;就可以在上传视频后切成ts格…

车机开发—【CarService启动流程】

汽车架构&#xff1a;车载HAL是汽车与车辆网络服务之间的接口定义&#xff08;同时保护传入的数据&#xff09;&#xff1a; 车载HAL与Android Automotive架构&#xff1a; Car App&#xff1a;包括OEM和第三方开发的AppCar API&#xff1a;内有包含CarSensorManager在内的AP…

5个有效的华为(HUAWEI)手机数据恢复方法

5个有效的手机数据恢复方法 华为智能手机中的数据丢失比许多人认为的更为普遍。发生这种类型的丢失有多种不同的原因&#xff0c;因此数据恢复软件的重要性。您永远不知道您的智能手机何时会在这方面垮台&#xff1b;因此&#xff0c;预防总比哀叹好&#xff0c;这就是为什么众…

通过 FTP 使用 Python 自动压缩网站图像

图像压缩对于技术SEO世界来说并不陌生,但是随着核心生命体征形式的网站性能是一个排名因素,现在是时候开始采取行动了。我已经做了几十次网站审计,我发现 80% 的网站性能问题都可以在图像或 JavaScript 下进行。当我看到图像是一个大问题时,我会欢呼,因为它是最容易解决的…

注意啦,面试通过后,别忘了教师资格证认定

所有要「教师资格证认定」教程的宝子们看过来面试合格的小伙伴都可以进行认定工作 . 认定时间 查询各省份认定公告&#xff0c;确定认定时间范围。以下是公告汇总网址&#xff08;https://www.jszg.edu.cn/portal/qualification_cert/dynamics?id21691&#xff09; 认定次数 每…

【jQuery】js实现文件浏览功能

1.说明 近期遇到一个浏览用户文件的需求&#xff0c;类似于访问百度网盘那样的列表&#xff0c;包含文件和文件夹&#xff0c;这个功能实现起来很简单&#xff0c;从服务器获取到的文件列表至少要有文件id、父级文件id、是否文件夹这三个字段 2.html设计 前端排版看你实际情…

x86架构设备的OpenWrt的空间扩容问题

openwrt固件是squashfs-combined-efi非exf4格式 直接将原有根分区扩容 用插件是&#xff1a;fdisk,losetup,resize2fs,blkid df -h fdisk -l fdisk /dev/sda //进入fdisk分区管理工具注意fdisk后参数是磁盘名称&#xff0c;是要根据实际情况填写 fdisk /dev/sda //进入fdi…

【04-JVM面试专题-什么是双亲委派机制(父类委托机制)?如何打破双亲委派机制?双亲委派机制的优缺点?什么是沙箱安全机制呢?】

什么是双亲委派机制&#xff1f;如何打破双亲委派机制&#xff1f; JVM的双亲委派机制知道吗&#xff1f;怎么打破它呢&#xff1f;你看看自己掌握的怎么样呢&#xff1f; 什么是双亲委派机制&#xff1f;(父类委托机制) 检查某个类是否已经加载 自底向上&#xff0c;从Custom…

将数组中的每个元素四舍五入到指定的精度numpy.rint()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组中的每个元素 四舍五入到指定的精度 numpy.rint() 选择题 请问np.rint(a)的输出结果是? import numpy as np anp.array([-1.72,-1.3,0.37,2.4]) print("【显示】a&#xff1a;\n…

requests库基本用法

目录 1 GET请求 1.1 无参数 1.2 查询字符串 2 POST 2.1 无参数 2.2 json数据 2.3 文件 3 一些常见的请求 3.1 base64 requests是请求用的&#xff0c;在发起请求中requests会默认帮我们解决一些问题&#xff0c;比如跨域 下面做几个例子&#xff0c;服务选用…

CTFer成长之路之SSRF漏洞

SSRF漏洞CTF SSRF Training 题目描述: web容器中存在一个flag&#xff0c;mysql中存在一个管理员账号密码&#xff0c;其余容器中均没有特定flag mysql容器中内置 tcpdump vulnweb容器中内置一个 fpm.py 攻击脚本 docker-compose.yml version: "3" services:w…

有色金属行业数字化之路探析

有色金属行业是我国国民经济的支柱产业和重要组成部分&#xff0c;是处于整个原材料生产链的上游环节&#xff0c;其支撑着冶炼、钢铁、智能制造业、芯片、建筑等行业的发展&#xff0c;也是是科学研究、国防建设等方面发展的重要材料基础&#xff0c;同时还是保障国家综合实力…

Linux之安装node

Linux之安装node步骤如下 1.去网站下载node 下载地址&#xff1a; https://npm.taobao.org/mirrors/ 2.上传到指定目录下 3.解压 tar -zxvf node-v17.3.0-linux-x644.配置node环境变量 //执行以下命令 vim /etc/profile //在path中加入以下内容 /usr/local/node-v15.14.0/b…

电力电子系统仿真软件--Psim仿真软件设计

目录 1.简介 2.应用优势 3.应用领域 4.电路结构 5.界面介绍 6.应用实例 6.1 主电路部分 6.2 控制电路部分 6.3 具体的电路原理及仿真搭建过程后续会一一介绍&#xff0c;请各位点赞关注&#xff0c;你的关注将是博主最大的更新动力。 7.电力系统仿真软件下载链接 1.简…

以萨技术在科创板IPO终止:计划募资15亿元,实控人为李凡平

2月21日&#xff0c;上海证券交易所披露的信息显示&#xff0c;因以萨技术股份有限公司&#xff08;下称“以萨技术”&#xff09;及其保荐人撤回发行上市申请&#xff0c;根据《上海证券交易所股票发行上市审核规则》第六十三条的相关规定&#xff0c;上海证券交易所终止其发行…

创业能否成功?这几个因素很重要!

创业能否成功&#xff1f;这几个因素很重要&#xff01; 2023-02-22 19:06:53 大家好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 上周末跟朋友一起钓鱼&#xff0c;他跟吐槽现在生意越来越难做。他是我身边可以说是创业很成功的例子&#…

拨开迷雾 看见vivo穿越周期的秘密

文|智能相对论作者|佘凯文任何一个行业都有周期性&#xff0c;就好像我们在做股票投资的时候&#xff0c;提到最多的就是周期规律&#xff0c;因为只有掌握规律才可以让我们赚到钱。所以不论是哪家公司都逃脱不了行业周期的宿命。行业寒冬方显强者本色就拿手机行业来说吧&#…