STL list基本用法

news2024/11/23 21:18:58

目录

  • list的使用
    • 构造函数和赋值重载
    • 迭代器(最重要)
    • 容量相关
    • 插入删除
    • 元素操作
      • reverse
      • sort
      • unique
      • remove
      • splice

list的底层实际是双向链表结构

list的使用

构造函数和赋值重载

构造函数说明
list()无参构造
list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list

构造函数和前面的容器用法相同

void test1()
{
	list<int> lt1;//无参构造

	list<int> lt2(10, 1);//1,1,1,1,1,1,1,1,1,1

	list<int> lt3(lt2);//拷贝构造

	list<int> lt4(lt2.begin(), lt2.end());
}

赋值重载

list& operator= (const list& x);
void test1()
{
	list<int> lt1;//无参构造

	list<int> lt2(10, 1);//1,1,1,1,1,1,1,1,1,1

	list<int> lt3(lt2);//拷贝构造

	list<int> lt4(lt2.begin(), lt2.end());

	list<int> lt5;
	lt5 = lt4;//赋值重载
}

迭代器(最重要)

迭代器类型分为三种:单向迭代器、双向迭代器、随机迭代器

单向迭代器:支持++          例如forward_list、哈希的迭代器类型是单向迭代器
双向迭代器:支持++,- -      例如list、map、set的迭代器类型是双向迭代器
随机迭代器:支持++,- -,+,-   例如vector、string、deque的迭代器类型是随机迭代器

随机迭代器可以认为是特殊的双向迭代器,双向迭代器可以认为是特殊的单向迭代器

在这里插入图片描述


list的迭代器与vectorstring不同
迭代器的类型是与容器底层结构决定的

vectorstring的底层是连续的,所以它们的迭代器实际上就是指针,所以它们支持++,–,+,- ,类型是随机迭代器

list的底层是不连续的,前后是通过指针连接在一起的,所以它的迭代器不是指针(实际上是指针经过封装),经过封装后,迭代器会支持++、- -,类型是单向迭代器

对于不支持+,-,这样封装是因为:像it.begin()+5这样的效率太低,C++不支持

list的迭代器不支持像vector中的it.begin()+5,如果这样写会报错

在这里插入图片描述
只支持++,--

void test2()
{
	list<int> lt{ 1,2,3,4,5,6 };
	lt.begin()--;
	lt.begin()++;
}

如果想将list的迭代器像vectorit.begin()+5一样移动多个位置,只能这样:

void test2()
{
	list<int> lt{ 1,2,3,4,5,6 };
	list<int>::iterator it = lt.begin();
	for (size_t i = 0; i < 5; i++)
	{
		++it;
	}
}

剩下的,list迭代器也支持之前的函数,用法也相同
在这里插入图片描述


容量相关

empty

bool empty() const;

判断容器是否为空


size

size_type size() const;

返回容器中元素的个数


插入删除

list作为双向循环链表,头插,头删,尾插,尾删的效率都很高,所以list中都支持这些操作

函数说明
void push_front (const value_type& val);在list首元素前插入值为val的元素
void pop_front();删除list中第一个元素
void push_back (const value_type& val);在list尾部插入值为val的元素
void pop_back();删除list中最后一个元素
void test3()
{
	list<int> lt{ 1,2,3,4,5,6 };
	lt.push_back(10);
	lt.push_front(0);
	lt.pop_back();
	lt.pop_front();
}

insert

iterator insert (iterator position, const value_type& val);

void insert (iterator position, size_type n, const value_type& val);
	
template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);

insert的操作和vector中的用相同,但是这个insert不会导致迭代器失效
因为链表的插入必须要扩容,迭代器是指向某一个节点,插入后迭代器还是指向原先的节点,不会导致失效

erase

iterator erase (iterator position);
iterator erase (iterator first, iterator last);

erase 的操作和vector中的用相同,这个erase 会导致迭代器失效
迭代器是指向某一个节点,删除这个节点后,迭代器失效


元素操作


reverse

void reverse();

这个reverselist类中自带的一个函数,作用是逆置链表

<algorithm>中也有一个reverse函数
reverse函数中迭代器类型是双向迭代器,而list的迭代器类型就是双向迭代器,所以list也可以使用<algorithm>中的reverse
在这里插入图片描述

void test4()
{
	list<int> lt{ 1,2,3,4,5,6 };
	lt.reverse();
	reverse(lt.begin(), lt.end());
}



sort

void sort();

作用是排序,底层是归并
<algorithm>中也有sort函数,但是对于list来说,想要排序,只能使用list库中的sort函数,不能使用<algorithm>中也有sort

因为list的迭代器类型是双向迭代器,而<algorithm>中的sort的参数迭代器的类型是随机迭代器,所以list不能使用<algorithm>中的sort函数。

其实这里的sort意义不大,因为相对于<algorithm>中的sort效率低(list中的sort底层使用的是归并,<algorithm>中的sort使用的是快排)
而唯一的意义是:方便,数据量小了可以拍,但是数据量再大,就不要使用list中的sort

如果想要排序,完全可以把list中的数据拷贝到vector中,然后排vector,排序完之后再把数据拷贝会list

void test5()
{
	list<int> lt{ 5,7,3,9,1,0,4,7,8,9,4, };
	vector<int> v;

	//将数据从list拷贝到vector
	for (auto e : lt)
	{
		v.push_back(e);
	}

	//在vector中排序
	reverse(v.begin(), v.end());

	//再把数据从vector拷贝到list中
	for (auto e : v)
	{
		lt.push_back(e);
	}
}



unique

void unique();

作用是去重,但是需要先排序

void test6()
{
	list<int> lt{2,6,5,2,2,2,2};
	lt.sort();
	lt.unique();// 5,6
}



remove

void remove (const value_type& val);

remove的作用是先找到所有val的位置,然后erase掉所有的val

void test6()
{
	list<int> lt{1,2,3,4,5,6,6,7,8};

	//移除元素6
	lt.remove(6);//1,2,3,4,5,7,8
}



splice


void splice (iterator position, list& x);

void splice (iterator position, list& x, iterator i);
	
void splice (iterator position, list& x, iterator first, iterator last);

splice的作用是转移节点

  • void splice (iterator position, list& x),将x链表中的所有元素转移到position位置
  • void splice (iterator position, list& x, iterator i),将x链表中i位置的元素转移到position位置
  • void splice (iterator position, list& x, iterator first, iterator last),将x链表中[first,last)中的元素转移到position位置
void test7()
{
	list<int> lt1{ 1,2,3,4,5,6,7 };
	list<int> lt2{ 0,0 };

	lt2.splice(++lt2.begin(), lt1);

	for (auto e : lt1)
	{
		cout << e << " ";
	}//lt1中的元素转移空了
	cout << endl;

	for (auto e : lt2)
	{
		cout << e << " ";
	}//0 1 2 3 4 5 6 7 0
	cout << endl;


	list<int> lt3{ 1,2,3,4,5,6,7 };
	list<int> lt4{ 0,0 };

	lt4.splice(++lt4.begin(), lt3, ++lt3.begin());
	for (auto e : lt3)
	{
		cout << e << " ";
	}//1 3 4 5 6 7
	cout << endl;

	for (auto e : lt4)
	{
		cout << e << " ";
	}//0 2 0
	cout << endl;


	list<int> lt5{ 1,2,3,4,5,6,7 };
	list<int> lt6{ 0,0 };

	lt6.splice(++lt6.begin(), lt5,++++lt5.begin(), --lt5.end());
	for (auto e : lt5)
	{
		cout << e << " ";
	}//1 2 7
	cout << endl;

	for (auto e : lt6)
	{
		cout << e << " ";
	}//0 3 4 5 6 0
	cout << endl;
}

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

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

相关文章

docker 部署服务

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 [rootbogon ~]# docker pull mysql:5.6 [rootbogon ~]# docker pull owncloud [rootbogon ~]# docker run -itd --name mysql --env MYSQL_ROOT_PASSWORD123456 mysql:5.6 [rootbogon ~]# docker run -itd -…

SeLinux权限说明及问题解决

一、SELinux文件访问安全策略和app权限配置 在android6.0以后的版本&#xff0c;google采用了SELinux的文件访问安全策略&#xff0c;想比较以前&#xff0c;绝对提高了文件的安全&#xff0c;不像以前那样&#xff0c; 对文件访问可以是无条件的。本篇文章就分享下常用的一些…

走进大模型

1、应用大模型 AIGC 是基于大模型的&#xff0c;而大模型的基础是深度学习。上一篇文章对深度学习进行了初步介绍&#xff0c;首先是深度学习的神经元起源&#xff0c;引发了基于线性函数的模拟&#xff0c;又因为线性函数无法习得逻辑异或&#xff0c;因此引入了非线性的激活…

Linux系统常用指令

目录 1.帮助指令 2.文件目录指令* 3.查找指令 4.时间日期指令 5.压缩和解压 1.帮助指令 ctrl c 取消命令&#xff0c;并且换行&#xff08;清空换行&#xff09;作用&#xff0c;单独清空为crtl u tab换行键 补全命令和文件名&#xff0c;快速按两下可以显示备选选项 …

kafka-python 消费者消费不到消息

排除步骤1&#xff1a; 使用group_id”consumer_group_id_001“ 和 auto_offset_reset"earliest" from kafka import KafkaConsumerconsumer KafkaConsumer(bootstrap_servers["dev-kafka01.test.xxx.cloud:9092"],enable_auto_commitTrue, auto_commit…

arm: day8

1.中断实验&#xff1a;按键控制led灯 流程&#xff1a; key.h /*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒***************************************…

02-Flask框架和项目启动

安装Flask 1. 使用pycharm 企业版,直接选择Flask 2. 手动安装 (1) 进入终端进入虚拟环境 执行 pip list ,查看虚拟环境已安装的已三方库 (2) 手动安装Flask第三方库 pip install flask2.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/ (3) 安装 pymysl ,和数据库关联第三…

HexoAssistant——博客上传助手(含源码)

文章目录 HexoAssistant——博客上传助手(含源码)1 前言2 效果演示3 源码地址4 总结 HexoAssistant——博客上传助手(含源码) 1 前言 旅行之余&#xff0c;用PyQt5写了一个博客上传的工具&#xff0c;旨在更加便捷地将本地文章上传Github博客。之前虽然配置过hexogithub的博客…

2023-8-22 模拟栈

题目链接&#xff1a;模拟栈 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while(m--){string op;int x;cin >> op;if(op "push") {cin >> x;stk[tt] x;}else if(op "…

浅入深出充分理解-->(fork())父子进程

目录 进程是如何被管理的 Linux下的进程是如何被管理的 fork()父子进程的创建 1&#xff1a;为什么fork返回给父进程子进程的id&#xff0c;给子进程返回0 2&#xff1a;一个函数是如何做到返回两次的 3&#xff1a;一个变量怎么会有不同内容 在某一个时刻,我正在用电脑打…

【Unity3D】水面特效

1 前言 水波特效 中通过屏幕后处理实现了环形水波效果&#xff0c;本文通过 Shader Graph 实现了模拟水面特效&#xff0c;包含以下特效细节。 深水区和浅水区颜色差异&#xff1b;水面有波纹&#xff0c;并且在移动&#xff1b;水面起伏波动&#xff1b;水面边缘有水泡&#…

《数字图像处理-OpenCV/Python》连载(1)前言

《数字图像处理-OpenCV/Python》连载&#xff08;1&#xff09;前言 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 写作背景 编写本书的初衷&#xff0c;源自作者学习数字图像处理的经历。 在创新实验班开设的专业创新教育课程中&#xff0c;我选择的…

基于springboot灾区物资管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

RestFul API 详解

目录 一、RestFul API 概述1.1 API1.2 RestFul API 二、REST概述三、RestFul API 规范3.1 动作3.2 路径&#xff08;接口命名&#xff09;3.3 过滤信息&#xff08;Filtering&#xff09;3.4 状态码&#xff08;Status Codes&#xff09; 四、RESTful 的极致 HATEOAS 一、RestF…

Node.JS教程

文章目录 Node.JSNode.js学习指南一、Node.js基础1.认识Node.js2.开发环境搭建3. 模块、包、commonJS3.1、为什么要有模块化开发&#xff1f;3.2、CommonJS规范3.3、 modules模块化规范写法 总结 Node.JS Node.js学习指南 服务端开发底层平台周边生态 学习前提 JavaScript、E…

2023年菏泽市中职学校技能大赛“网络安全”赛项规程

2023年菏泽市中职学校技能大赛 “网络安全”赛项规程 一、赛项名称 赛项名称&#xff1a;网络安全 赛项所属专业大类&#xff1a;信息技术类 二、竞赛目的 通过竞赛&#xff0c;检验参赛选手对网络、服务器系统等网络空间中各个信息系统的安全防护能力&#xff0c;以及分析…

第二篇论文写作启发点V5

第二篇论文写作启发点V5 2.LLFLow模型的缺陷&#xff0c;这是先验&#xff0c;如果先验出现错误&#xff0c;那么后面这个模型都会错误。而我们使用了学习的方式去解决 3. 参考文献和实验时的对照模型最好使用最新的&#xff0c;就是没有被引用过的&#xff0c;这样可以降低论文…

【大数据】Linkis 简述

Linkis 简述 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件&#xff0c;用于解决前台各种工具、应用&#xff0c;和后台各种计算存储引擎间的连接、访问和复用问题。 1.引言…

ImportError: cannot import name ‘SQLDatabaseChain‘ from ‘langchain‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

使用IDEA把Java程序打包成jar

点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…