STL list基本用法

目录

  • 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.mfbz.cn/a/92057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习笔记_进阶篇(一)_浅析tornado web框架

tornado简介 1、tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架&#xff08;包括大多数 Python 的框架&#xff09;有着明显的区别&#xff1a;它是非阻塞式服务器&#xff0c;而且速度相当快。得利于…

Clock Domain Crossing(CDC)跨时钟域

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ​跨时钟域(CDC)指的是信号由一个时钟域进入另一个时钟域,以下图为例。 ● F1属于clk1时钟域 ● Q1属于clk1时钟域的信号 ● F2属于clk2时钟域 ● Q2属于clk2时钟域的信号 ● Q1对于F2来说是…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

数据结构(Java实现)-二叉树(下)

获取二叉树的高度 检测值为value的元素是否存在(前序遍历) 层序遍历 判断一棵树是不是完全二叉树 获取节点的路径 二叉树的最近公共祖先

c++的IO流

前言 很多编程语言都有自己的输入输出流&#xff0c;流是一种抽象的概念&#xff0c;为了方便我们使用各种输入输出设备从而抽象出来的概念。 目录 1.C语言的输入和输出 2.流的概念 3.CIO流 3.1C标准I/O流 3.2C文件I/O流 4.stringstream的简单介绍 1.C语言的输入和输出 在…

MIUI 欧版刷机教程(操作篇)

文章目录 0 前置条件1 下载ROM包2 确定刷机方式3 线刷教程4 卡刷教程使用系统更新使用 TWRP 问题汇总 0 前置条件 必须先解除手机的 bootloader 锁。详细教程参见官网&#xff1a;申请解锁小米手机 (miui.com)。 1 下载ROM包 在 MIUI EU 官方论坛&#xff08;需要科学上网&a…

css-选择器、常见样式、标签分类

CSS CSS简介 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可…

呈现数据的精妙之道:选择合适的可视化方法

在当今数据时代&#xff0c;数据可视化已成为理解和传达信息的重要手段。然而&#xff0c;选择适合的数据可视化方法对于有效地呈现数据至关重要。不同的数据和目标需要不同的可视化方法&#xff0c;下面我们将探讨如何选择最佳的数据可视化方法来呈现数据。 1. 理解数据类型&a…

蓝蓝设计-UI设计公司作品-博晖创新原子吸收光谱仪软件交互及界面设计

博晖创新原子吸收光谱仪软件交互及界面设计 图标设计 | 交互设计 | 界面设计 博晖公司拥有强大的自主研发实力&#xff0c;建立了专业的研发团队&#xff0c;通过不断的技术创新&#xff0c;形成了分子诊断、免疫诊断、原子吸收、原子荧光及质谱五大技术平台&#xff0c;并成功…

Vue中使用vue-drag-resize实现窗体可拖拽和随意缩放大小

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_ruoyi本地调式_霸道流氓气质的博客-CSDN博客 在上面的基础上&#xff0c;实现弹窗窗体可移动以及随意缩放大小。 效果如下 注&#xff1a; 博客&am…

【Go 基础篇】Go语言中的defer和recover:优雅处理错误

Go语言以其简洁、高效和强大的特性受到了开发者的热烈欢迎。在错误处理方面&#xff0c;Go语言提供了一种优雅的机制&#xff0c;即通过defer和recover组合来处理恐慌&#xff08;panic&#xff09;错误。本文将详细介绍Go语言中的defer和recover机制&#xff0c;探讨其工作原理…

vue页面中想在input框用户输入的参数后加单位的方法

<el-form-item label"金重" prop"weight"><el-input v-model"form.weight" placeholder"请输入金重"><template #append><div>g</div></template></el-input></el-form-item>

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

8086汇编test指令学习

Test指令将两个操作数进行逻辑与运算&#xff0c;并根据运算结果设置相关的标志位。Test的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。 TEST AX,BX 与 AND AX,BX 命令有相同效果&#xff0c;只是Test指令不改变AX和BX的内容&#xff0c;而AND指令会把结果保…

入门超值型32位单片机MM32G0001开发板

灵动微入门级超值型MM32G0001系列MCU。采用48MHz ArmCortex-M0内核&#xff0c;提供16KB Flash和2KB SRAM&#xff0c;并提供丰富的外设资源。适用于多种多样的入门级32位MCU市场&#xff0c;可覆盖广泛的8/16位MCU升级需求。MM32G0001在各种温度范围内的闪存擦写寿命与数据保存…

跟随角色镜头时,解决地图黑线/白线缝隙的三种方案

下面一共三个解决方案&#xff0c;这里我推荐第二个方案解决&#xff0c;因为够快速和简单。 现象&#xff1a; 解决方案一&#xff1a; 参考【Unity2D】去除地图中的黑线_unity选中后有线_香菇CST的博客-CSDN博客&#xff0c;博主解释是因为抗锯齿采样导致的问题。 具体到这…

YOLOv5算法改进(7)— 添加SimAM注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。SimAM&#xff08;Similarity-based Attention Mechanism&#xff09;是一种基于相似度的注意力机制&#xff0c;它的原理是通过计算查询向量与每个键向量之间的相似度&#xff0c;从而确定每个键向量对于查询向量的重要性…

nrm管理源仓库及发布私人npm包

使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出&#xff1a;这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx&#xff08;源仓库名&#xff09;来切换不同的源地址 nrm use taobao…

代码随想录算法训练营第四十七天|LeetCode 382,115

目录 LeetCode 392.判断子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 115.不同的子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 …

在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速

WSL2使用NVIDIA Docker进行全栈开发和深度学习 1. 前置条件 1.1. 安装系统 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11 跳过 1.2. 处理好网络环境 安装过程中需要访问国际网络&#xff0c;自行处理好。建议开启 tu…
最新文章