【C++中STL】list链表

news2024/11/23 22:33:07

List链表

  • 基本概念
  • 构造函数
  • 赋值和交换
  • 大小操作
  • 插入和删除
  • 数据存取
  • 反转和排序

基本概念

将数据进行链式存储
链表list是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的,链表是由一系列结点组成,结点的组成一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向循环链表。更深层次的理解可以看看数据结构中的链表。
优点:可以对任意的位置进行快速插入或删除元素。
缺点:容器遍历速度,没有数组快,占用的空间比数组大。
数组的优缺点和链表相反。
在这里插入图片描述
在这里插入图片描述
在链表中在任意位置插入和删除元素不会造成原有list迭代器的失效,这个在vector中不成立。
总结:STL中list和vector是两个最常被使用的容器,各有优缺点。

构造函数

1、list lst;默认构造函数形式,采用模板类实现
2、list(beg,end);构造函数将[beg,end]区间中的元素拷贝给本身
3、list(n,elem);构造函数将n个elem拷贝给本身
4、list(const list &lst);拷贝构造函数

void test1() {
	list<int> l;
	l.push_back(123);
	l.push_back(50);
	l.push_back(34);
	l.push_back(111);
	p(l);
	list<int>l2(l.begin(), l.end());
	p(l2);
	list<int>l3(5, 50);
	p(l3);
	list<int>l4(l3);
	p(l4);
}

赋值和交换

1、assign(beg,end);将[beg,end]区间中的元素拷贝给本身
2、assign(n,elem);将n个elem赋值给本身
3、list& operator=(const list &lst);重载等号操作符
4、swap(lst);将lst和本身的元素互换

void test1() {
	...
	list<int>l2;
	l2.assign(l.begin(), l.end());
	list<int>l3;
	l3.assign(5, 50);
	list<int>l4;
	l4 = l3;
	l3.swap(l2);
...
}

大小操作

1、empty();判断容器是否为空
2、size();返回容器中元素的个数
3、resize(num);重新指定容器的长度为num,若容器变长,则以默认值0填充新位置;若容器变短,则末尾超出容器长度的元素被删除
4、resize(num,elem);重新指定容器的长度为num,若容器变长,则以elem值填充新位置;若容器变短,则末尾超出容器长度的元素被删除

if (!l.empty()) {
		cout << "大小" << l.size()<<endl;
	}
	l.resize(6,10);
	cout << "大小" << l.size() << endl;

插入和删除

1、push_back(ele);尾部插入元素ele
2、push_front();在头部插入一个数据
4、pop_back();删除最后一个元素
5、pop_front();删除第一个元素
6、insert(pos,ele);迭代器指向位置pos插入元素ele的拷贝,返回新数据的位置
7、insert( pos,n,ele);迭代器指向位置pos插入n个元素ele,无返回值
8、insert(pos,beg,end);在pos位置插入[beg,end)区间的数据,无返回值
9、erase(pos);删除pos位置的元素,返回下一个数据的位置
10、erase(beg,end);删除迭代器从start到end之间的元素,返回下一个数据的位置
11、clear();删除容器中的所有元素
12、remove(elem);删除容器中所有与elem值相匹配的元素

void test1() {
	list<int> l;
	l.push_back(123);
	l.push_back(50);
	p(l);
	l.erase(l.begin(), l.end());
	l.push_front(34);
	l.push_front(111);
	p(l);
	l.pop_back();
	l.pop_front();
	p(l);
	l.insert(l.begin(), 99);
	l.insert(l.begin()++, 3, 999);
	l.insert(l.end(), l.begin(), l.end());
	p(l);
	l.erase(l.begin());
	p(l);
	l.remove(999);
	p(l);
	l.clear();
	p(l);
}

数据存取

不可以使用[]和at访问,因为list链表不是连续性空间存储数据,迭代器不支持随机访问。
1、front();返回第一个元素
2、back();返回最后一个元素

void test1() {
	...
	cout << "第一个元素" << l.front() << endl;
	cout << "最后一个元素" << l.back() << endl;
}

反转和排序

1、reverse();反转
2、sort();排序

void test1() {
	list<int> l;
	l.push_back(123);
	l.push_back(50);
	l.push_front(34);
	l.push_front(111);
	//所有不支持随机访问迭代器的容器,不可以用标准算法
	//不支持随机访问迭代器的容器会内部会提供对应的一些算法
	sort(l.begin(), l.end());//运行时会报错
	//不属于全局函数,相当于成员函数,默认从小到大
	l.sort();
	p(l);
	l.sort(myCompare);
	p(l);
	l.reverse();
	p(l);
}

自定义类排序

class S {
public:
	int age;
	string name;
	int h;
	S(string _n, int _a,int _h) {
		name = _n;
		age = _a;
		h = _h;
	}
};
//降序排序
bool CompareS(S v1,S v2) {
	if (v1.age == v2.age) {
		return v1.h > v2.h;
	}
	return v1.age < v2.age;
}
void test1() {
	list<S> l;
	S s1("Tom", 18, 187);
	S s2("Lisa", 20, 165);
	S s3("LuJy", 34, 190);
	S s4("Tony", 21, 167);
	S s5("Ala", 20, 168);
	l.push_back(s1);
	l.push_back(s2);
	l.push_back(s3);
	l.push_back(s4);
	l.push_back(s5);
	for (list<S>::iterator it = l.begin();it != l.end();it++) {

		cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;
	}
	cout << "-----------------------------------------" << endl;
	l.sort(CompareS);
	for (list<S>::iterator it = l.begin();it != l.end();it++) {

		cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;
	}
}

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

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

相关文章

Android studio环境搭建过程异常

异常&#xff1a;Connect timed out 创建新项目时&#xff0c;提示time out 解决方案&#xff1a;修改gradle下载地址&#xff0c;使用国内镜像地址 distributionUrlhttps\://services.gradle.org/distributions/gradle-8.2-bin.zip修改成distributionUrlhttps\://mirrors.c…

fatal error:require():Failed opening required

今天部署网站遇到了个错误 fatal error:require():Failed opening required 这个错误经常遇到 大多是网站 是开启了 open_basedir 但今天这个错误很神奇 先说解决方法 1. 检测一下是不是真的 不存在这个文件 即使100%确定 也建议你再仔细看一下 这个文件存不存在 今天我遇…

日常学习之:如何使用 dockerfile 将 vue 的单独前端项目通过 docker 的方式部署到 heroku上

文章目录 需求描述开始操作准备阶段&#xff1a;准备 server.js 文件并安装依赖&#xff0c;将 vue 项目包装成单独的服务器制作 server.js安装 server.js 需要的依赖 构建 Dockerfileheroku container 链接和部署其他细节 需求描述 你想用 vue 构建前端&#xff0c;用 django…

终端录屏神器Asciinema慎用教程

1.效果 2.安装 centos yum install asciinema ubuntu apt-get install asciinema 3.使用 asciinema rec kali.cast #录制文件 asciinema play kali.cast #播放文件 asciinema upload kali.cast #上传文件 详细说明:只使用 asciinema rec 也是可以的,ctrlD结束录屏 4.…

2024年数学建模美赛 分析与编程

2024年数学建模美赛 分析与编程 1、本专栏将在2024年美赛题目公布后&#xff0c;进行深入分析&#xff0c;建议收藏&#xff1b; 2、本专栏对2023年赛题&#xff0c;其它题目分析详见专题讨论&#xff1b; 2023年数学建模美赛A题&#xff08;A drought stricken plant communi…

尚无忧球馆助教系统源码,助教小程序源码,助教源码,陪练系统源码

特色功能&#xff1a; 不同助教服务类型选择 助教申请&#xff0c;接单&#xff0c;陪练师入住&#xff0c;赚取外快 线下场馆入住 设置自己服务 城市代理 分销商入住 优惠券 技术栈&#xff1a;前端uniapp后端thinkphp 独立全开源

Redis 的二进制安装与包管理安装, 全发行版 Linux 通用

博客原文 文章目录 Redis 简介二进制编译安装获取源码包编译安装移动配置文件到安装目录下配置 redis 为后台启动将 redis 加入到开机启动设置 redis 密码 (可选)修改 bind启动 redis apt 安装更换阿里源(可选)安装 redis修改配置文件 Redis 简介 Redis&#xff08;全称为Remot…

【Go】Channel底层实现 ②

文章目录 channel底层实现channel发送、接收数据有缓冲 channelchannel 先写再读channel 先读再写(when the receiver comes first) 无缓冲channelchannel存在3种状态&#xff1a; channel底层实现 // channel 类型定义 type hchan struct {// channel 中的元素数量, lenqcoun…

1.26学习总结

连通性判断 DFS连通性判断步骤&#xff1a; 1.从图上任意一点u开始遍历&#xff0c;标记u已经走过 2.递归u的所有符合连通条件的邻居点 3.递归结束&#xff0c;找到了的所有与u的连通点&#xff0c;就是一个连通块 4.然后重复这个步骤找到所有的连通块 BFS连通性判断步骤…

opencv学习二值分析

内容来源于《opencv4应用开发入门、进阶与工程化实践》 二值分析&#xff1a; 常见的二值化方法&#xff1a; 基于全局阈值&#xff08;threshold&#xff09;得到的二值图像&#xff1b;基于自适应阈值&#xff08;adaptiveThreshold&#xff09;得到的二值图像&#xff1…

RPC教程 7.服务发现与注册中心

0.前言 这一节的内容只能解决只有一个服务的情况。要是有多个服务(即是多个结构体&#xff09;这种就解决不了&#xff0c;也即是没有服务ip地址和服务实例的映射关系。 1.为什么需要注册中心 在上一节中&#xff0c;客户端想要找到服务实例的ip,需要硬编码把ip写到代码中。…

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了&#xff0c;主要是因为硕士之后&#xff0c;也就没再继续深入研究这个课题了&#xff0c;更多的是在电科院的项目里会接触。这个课题方向其实作为硕士毕业课题还是够用的&#xff0c;相对来说也是比较容易毕业的&#xff0c;因为涉及的…

x-cmd pkg | go - Google 开发的开源编程语言

目录 简介首次用户技术特点竞品分析编译型语言解释型语言JavaWebAssebmly 进一步阅读 简介 Go 语言&#xff08;或 Golang&#xff09;是 Google 开发的开源编程语言&#xff0c;诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安…

Nodejs前端学习Day3_准备工作

妈的&#xff0c;这几天真tm冷&#xff0c;前天上午还下了一整天的雪&#xff0c;大雪 文章目录 前言一、Node.js简介1.1何为1.2有什么 二、Node.js可以做什么三、学习路线四、下载nodejs4.1小坑记录4.2LTS和Current版本的不同 五、什么是终端六、在nodejs中执行js代码七、powe…

Python 中的 strip 函数用法,你真的学会了吗?

Python 提供了大量内置函数&#xff0c;使编程变得更加简单。strip 就是这样一个函数。在本文中&#xff0c;我们将探讨 strip 是什么、为什么有用以及如何有效地使用它。 什么是 strip strip 是一种内置方法&#xff0c;用于删除字符串中的前导字符和尾随字符。这些字符可以…

MYSQL库和表的操作(修改字符集和校验规则,备份和恢复数据库及库和表的增删改查)

文章目录 一、MSYQL库的操作1.连接MYSQL2.查看当前数据库3.创建数据库4.字符集和校验规则5.修改数据库6.删除数据库7.备份和恢复8.查看连接 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、MSYQL库的操作 1.连接MYSQL 我们使用下面的语句来连接MSYQL&#xff1a; my…

太阳能 LED 恒流电源 升降压原理图 AP9193 大功率升压恒流IC

特别 宽输入电压范围&#xff1a;3.6V~100V 高效率&#xff1a;可高达 95% 工作频率&#xff1a;1MHz CS 限流保护电压&#xff1a;250mV FB 电流采样电压&#xff1a;250mV 芯片供电欠压保护&#xff1a;2.5V 关断时间可调 外置频率补偿脚 应用领域 LED 灯杯 电池供…

docker容器运维命令

文章目录 docker psdocker execdocker inspectdocker topdocker attachdocker waitdocker exportdocker importdocker portdocker cpdocker diffdocker renamedocker statsdocker update总结 docker ps 列出容器。 docker ps [OPTIONS]OPTIONS说明&#xff1a; -a :显示所有的…

FPGA 通过 UDP 以太网传输 JPEG 压缩图片

FPGA 通过 UDP 以太网传输 JPEG 压缩图片 简介 在 FPGA 上实现了 JPEG 压缩和 UDP 以太网传输。从摄像机的输入中获取单个灰度帧&#xff0c;使用 JPEG 标准对其进行压缩&#xff0c;然后通过UDP以太网将其传输到另一个设备&#xff08;例如计算机&#xff09;&#xff0c;所有…

计算方法实验1:熟悉MATLAB 环境

一、问题描述 熟悉MATLAB 环境。 二、实验目的 了解Matlab 的主要功能&#xff0c;熟悉Matlab 命令窗口及文件管理&#xff0c;Matlab 帮助系统。掌握命令行的输入及编辑&#xff0c;用户目录及搜索路径的配置。了解Matlab 数据的特点&#xff0c;熟悉Matlab 变量的命名规则&a…