C++SLT(三)——list

news2025/2/7 0:29:40

目录

  • 一、list的介绍
  • 二、list的使用
    • list的定义方式
  • 三、list的插入和删除
    • push_back和pop_back
    • push_front和pop_front
    • insert
    • erase
  • 四、list的迭代器使用
  • 五、list的元素获取
  • 六、list的大小控制
  • 七、list的操作函数
    • sort和reverse
    • merge
    • remove
    • remove_if
    • unique
    • assign
    • swap


一、list的介绍

  1. list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。
  3. list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。
    与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。
  4. list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)。

二、list的使用

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 test_list()
{
	//构造int类型的空容器
	list<int> lt1;			

	// 构造一个含有n个val的某类型容器
	list<int> lt2(5, 2);

	//拷贝构造某类型容器
	list<int> lt3(lt2);

	//使用迭代器拷贝构造某一段内容
	string str("hello world");
	list<char> lt4(str.begin(), str.end());				//构造string对象某段区间的复制品

	//构造数组某段区间的复制品
	int arr[] = { 1, 2, 3, 4, 5 };
	list<int> lt5(arr, arr + sizeof(arr) / sizeof(int));
}

三、list的插入和删除

函数声明接口说明
push_back在list尾部插入值为val的元素
pop_back删除list中最后一个元素
push_front在list首元素前插入值为val的元素
pop_front删除list中第一个元素
insert在list position 位置中插入值为val的元素
erase删除list position位置的元素

push_back和pop_back

void test1_list()
{
	//push_back()和pop_back(),两种循环都可以
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	auto it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";			//1 2 3 4
		++it;
	}
	cout << endl;

	lt.pop_back();
	lt.pop_back();
	for (auto e : lt)
	{
		cout << e << " ";			//1 2
	}
	cout << endl;
}

push_front和pop_front

void test2_list()
{
	//push_front和pop_front,通常用范围for方便一点
	list<int> lt1;
	lt1.push_front(1);
	lt1.push_front(2);
	lt1.push_front(3);
	for (auto e : lt1)
	{
		cout << e << " ";			//3 2 1
	}
	cout << endl;
	
	lt1.pop_front();
	for (auto e : lt1)
	{
		cout << e << " ";			//2 1
	}
	cout << endl;
}

insert

  1. 在指定迭代器位置插入一个数。
  2. 在指定迭代器位置插入n个值为val的数。
  3. 在指定迭代器位置插入一段迭代器区间(左闭右开)。
void test3_list()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);


	//5前插入17
	//v.insert(v.begin() + 5, 17);		//顺序表的话迭代器开头+5就可以插入
	auto it = lt.begin();				//链表,1.类似指针指到5前,2.插入
	for (size_t i = 0; i < 5; i++)		
	{
		++it;
	}
	lt.insert(it,17);					
	for (auto e : lt)
	{
		cout << e << " ";				//1 2 3 4 5 17
	}
	cout << endl;
	
	//在指定的数前插入,例如在4前插入100,使用find找到该数
	it = find(lt.begin(), lt.end(), 4);
	if (it != lt.end())
	{
		lt.insert(it, 100);
	}
	for (auto e : lt)
	{
		cout << e << " ";				//1 2 3 100 4 5 17
	}
	cout << endl;
}

find函数是头文件“algorithm”当中的一个函数,该函数在指定迭代器区间(左闭右开)寻找指定值的位置,并返回该位置的迭代器。

template<class InputIterator, class T>
 InputIterator find (InputIterator first, InputIterator last, const T& val)
{
 while (first!=last) {
   if (*first==val) return first;
   ++first;
 }
 return last;
}

erase

list当中的erase函数支持两种删除方式:

  1. 删除指定迭代器位置的元素。
  2. 删除指定迭代器区间(左闭右开)的所有元素。
void test4_list()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	lt.push_back(7);

	auto it = find(lt.begin(), lt.end(), 3);
	lt.erase(it);								//删除3
	for (auto e : lt)
	{
		cout << e << " ";						//1 2 4 5 6 7
	}
	cout << endl;

	it = find(lt.begin(), lt.end(), 5);
	lt.erase(it, lt.end());						//删除5后所有元素(左闭右开)
	for (auto e : lt)
	{
		cout << e << " ";						//1 2 4
	}
	cout << endl;
}

四、list的迭代器使用

函数声明接口说明
begin + end返回第一个元素的迭代器+返回最后一个有效元素下一个位置的迭代器
rbegin + rend返回第一个元素的reverse_iterator,即end位置,返回最后一个有效元素下一个位置的reverse_iterator,即begin位置
void test5_list()
{
	//正向迭代器遍历容器
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	//list<int>::iterator it = lt.begin();
	auto it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";				//1 2 3 4
		++it;
	}
	cout << endl;

	//反向迭代器遍历容器
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	auto rit = lt1.rbegin();
	while (rit != lt1.rend())
	{
		cout << *rit << " ";			//4 3 2 1
		++rit;
	}
	cout << endl;
}

五、list的元素获取

函数声明接口说明
front返回list的第一个节点中值的引用
back返回list的最后一个节点中值的引用
void test6_list()
{

	list<int> lt;
	lt.push_back(0);
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	cout << lt.front() << endl;		//0
	cout << lt.back() << endl;		//4
}

六、list的大小控制

函数声明接口说明
size返回list中有效节点的个
resize1.当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。2.当所给值小于当前的size时,将size缩小到该值。
empty检测list是否为空,是返回true,否则返回false
clear清空list中的有效元素
void test7_list()
{
	//size获取当前容器当中的元素个数
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	cout << lt.size() << endl;			//4


	//resize扩容(可赋值)或缩容
	list<int> lt1(5, 2);
	for (auto e : lt1)
	{
		cout << e << " ";				//2 2 2 2 2
	}
	cout << endl;

	lt1.resize(8, 5);					//将size扩大为8,扩大的值为5
	for (auto e : lt1)
	{
		cout << e << " ";				//2 2 2 2 2 5 5 5
	}
	cout << endl;

	lt1.resize(3);						//将size缩小为3
	for (auto e : lt1)
	{
		cout << e << " ";				//2 2 2
	}
	cout << endl;


	//empty判断是否为空,没元素返回1,有元素返回0
	list<int> lt2;
	cout << lt2.empty() << endl;		//1
	cout << lt1.empty() << endl;		//0


	//clear清空容器(size元素)
	list<int> lt4(5, 2);
	for (auto e : lt4)
	{
		cout << e << " ";				//2 2 2 2 2
	}
	cout << endl;						
	cout << lt4.size() << endl;			//5

	lt.clear();							//清空容器
	for (auto e : lt)
	{
		cout << e << " ";				//(无数据)
	}
	cout << endl;								
	cout << lt.size() << endl;			//0
}

七、list的操作函数

函数声明接口说明
sort将容器当中的数据默认排为升序
reverse将容器当中元素的位置进行逆置
splice用于两个list容器之间的拼接
remove用于删除容器当中特定值的元素
remove_if用于删除容器当中满足条件的元素
unique用于删除容器当中连续的重复元素
merge将一个有序list容器合并到另一个有序list容器当中,使得合并后的list容器任然有序。(类似于归并排序)
assign将新内容分配给容器,替换其当前内容
swap交换两个容器的内容

sort和reverse

void test8_list()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(10);
	lt.push_back(20);
	for (auto e : lt)
	{
		cout << e << " ";					//1 2 3 4 10 20
	}
	cout << endl;
	
	lt.reverse();
	for (auto e : lt)
	{
		cout << e << " ";					//20 10 4 3 2 1
	}
	cout << endl;
}

merge

merge函数用于将一个有序list容器合并到另一个有序list容器当中,使得合并后的list容器任然有序。(类似于归并排序)

void test10_list()
{
	list<int> lt;
	lt.push_back(17);
	lt.push_back(55);
	lt.push_back(32);
	list<int> lt1;
	lt1.push_back(11);
	lt1.push_back(3);
	lt1.push_back(100);
	lt.sort();
	lt1.sort();
	lt.merge(lt1);						//将lt1合并到lt
	for (auto e : lt)
	{
		cout << e << " ";				//3 11 17 32 55 100
	}
	cout << endl;
}

remove

remove函数用于删除容器当中特定值的元素。

void test9_list()
{
	int arr[] = { 12,65,32,11,22,11,3 };
	list<int> mylist(arr, arr + sizeof(arr) / sizeof(int));
	mylist.remove(11);
	for (auto e : mylist)
	{
		cout << e << " ";				//12 65 32 22 3
	}
	cout << endl;
}

remove_if

remove_if函数用于删除容器当中满足条件的元素

bool single_digit(const int& val)
{
	return val < 10;
}
void test11_list()
{
	list<int> lt;
	lt.push_back(3);
	lt.push_back(2);
	lt.push_back(65);
	lt.push_back(33);
	lt.push_back(9);
	lt.push_back(5);
	lt.push_back(4);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;							//3 2 65 33 9 5 4
	lt.remove_if(single_digit);				//删除容器当中值小于10的元素
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;							//65 33
}

unique

unique函数用于删除容器当中连续的重复元素。

void test12_list()
{
	list<int> lt;
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(3);
	lt.push_back(2);
	lt.push_back(1);
	lt.push_back(3);
	lt.push_back(3);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;			//2 3 3 2 1 3 3
	lt.sort();				
	lt.unique();			//删除容器当中连续的重复元素
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;			//1 2 3 
}

assign

assign函数用于将新内容分配给容器,替换其当前内容,新内容的赋予方式有两种:

  1. 将n个值为val的数据分配给容器。
  2. 将所给迭代器区间当中的内容分配给容器。
void test13_list()
{
	list<char> lt(3, 's');
	lt.assign(4, 'a');						//将新内容分配给容器,替换其当前内容
	for (auto e : lt)
	{
		cout << e << " ";					//a a a a
	}
	cout << endl;
	string str("hello word");
	lt.assign(str.begin(), str.end());		//将新内容分配给容器,替换其当前内容
	for (auto e : lt)
	{
		cout << e << " ";					//h e l l o   w o r d
	}
	cout << endl;
}

swap

void test14_list()
{
	list<int> lt1(5, 2);
	list<int> lt2(2, 6);
	lt1.swap(lt2);				 //交换两个容器的内容
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;				//6 6

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

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

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

相关文章

【数据结构】循环链表

循环链表 单链表局限性单向循环链表判断链表是否有环思路code 找到链表入口思路代码结构与逻辑 code 单链表局限性 单链表作为一种基本的数据结构&#xff0c;虽然在很多场景下都非常有用&#xff0c;但它也存在一些局限性&#xff1a; 单向访问&#xff1a;由于每个节点仅包含…

ImGui 学习笔记(二)—— 多视口

在计算机图形学中&#xff0c;视口&#xff08;Viewport&#xff09;是一个可观察的多边形区域。 将物体渲染至图像的过程中&#xff0c;会用两种区域表示。世界坐标窗口是用户所关注的区域&#xff08;即用户想要可视化的东西&#xff09;&#xff0c;坐标系由应用程序确定。…

安装和卸载RabbitMQ

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…

Apache HttpClient

HttpClient是apache组织下面的一个用于处理HTTP请求和响应的来源工具&#xff0c;是一个在JDK基础类库是做了更好的封装的类库。 HttpClient 使用了连接池技术来管理 TCP 连接&#xff0c;这有助于提高性能并减少资源消耗。连接池允许 HttpClient 复用已经建立的连接&#xff0…

Golang 并发机制-6:掌握优雅的错误处理艺术

并发编程可能是提高软件系统效率和响应能力的一种强有力的技术。它允许多个工作负载同时运行&#xff0c;充分利用现代多核cpu。然而&#xff0c;巨大的能力带来巨大的责任&#xff0c;良好的错误管理是并发编程的主要任务之一。 并发代码的复杂性 并发编程增加了顺序程序所不…

react使用DatePicker日期选择器

1、引入&#xff1a;npm i day 2、页面引入&#xff1a; import dayjs from dayjs; 3、使用 <DatePicker onChange{onChange} value{datas ? dayjs(datas) : null} /> 4、事件 const onChange (date, dateString) > {setInput(dateString)setDatas(dateString)…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开&#xff0c;我们尝试自己创建一个数据生成器&#xff0c;用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …

51单片机看门狗系统

在 STC89C52 单片机中&#xff0c;看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定&#xff0c;但是它在头文件中并未给出&#xff0c;因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…

RNN/LSTM/GRU 学习笔记

文章目录 RNN/LSTM/GRU一、RNN1、为何引入RNN&#xff1f;2、RNN的基本结构3、各种形式的RNN及其应用4、RNN的缺陷5、如何应对RNN的缺陷&#xff1f;6、BPTT和BP的区别 二、LSTM1、LSTM 简介2、LSTM如何缓解梯度消失与梯度爆炸&#xff1f; 三、GRU四、参考文献 RNN/LSTM/GRU …

Android记事本App设计开发项目实战教程2025最新版Android Studio

平时上课录了个视频&#xff0c;从新建工程到打包Apk&#xff0c;从头做到尾&#xff0c;没有遗漏任何实现细节&#xff0c;欢迎学过Android基础的同学参加&#xff0c;如果你做过其他终端软件开发&#xff0c;也可以学习&#xff0c;快速上手Android基础开发。 Android记事本课…

【R语言】获取数据

R语言自带2种数据存储格式&#xff1a;*.RData和*.rds。 这两者的区别是&#xff1a;前者既可以存储数据&#xff0c;也可以存储当前工作空间中的所有变量&#xff0c;属于非标准化存储&#xff1b;后者仅用于存储单个R对象&#xff0c;且存储时可以创建标准化档案&#xff0c…

为什么在springboot中使用autowired的时候它黄色警告说不建议使用字段注入

byType找到多种实现类导致报错 Autowired: 通过byType 方式进行装配, 找不到或是找到多个&#xff0c;都会抛出异常 我们在单元测试中无法进行字段注入 字段注入通常是 private 修饰的&#xff0c;Spring 容器通过反射为这些字段注入依赖。然而&#xff0c;在单元测试中&…

Unity游戏(Assault空对地打击)开发(6) 鼠标光标的隐藏

前言 鼠标光标在游戏界面太碍眼了&#xff0c;要隐藏掉。 详细操作 新建一个脚本HideCursor&#xff0c;用于隐藏/取消隐藏光标。 写入以下代码。 意义&#xff1a;游戏开始自动隐藏光标&#xff0c;按Esc&#xff08;隐藏<-->显示&#xff09;。 using System.Collectio…

哪些专业跟FPGA有关?

FPGA产业作为近几年新兴的技术领域&#xff0c;薪资高、待遇好&#xff0c;吸引了大量的求职者。特别是对于毕业生&#xff0c;FPGA领域的岗位需求供不应求。那么&#xff0c;哪些专业和FPGA相关呢&#xff1f; 哪些专业跟FPGA有关&#xff1f; 微电子学与固体电子学、微电子科…

UE5 蓝图学习计划 - Day 14:搭建基础游戏场景

在上一节中&#xff0c;我们 确定了游戏类型&#xff0c;并完成了 项目搭建、角色蓝图的基础设置&#xff08;移动&#xff09;。今天&#xff0c;我们将进一步完善 游戏场景&#xff0c;搭建 地形、墙壁、机关、触发器 等基础元素&#xff0c;并添加角色跳跃功能&#xff0c;为…

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…

Python----Python高级(并发编程:进程Process,多进程,进程间通信,进程同步,进程池)

一、进程Process 拥有自己独立的堆和栈&#xff0c;既不共享堆&#xff0c;也不共享栈&#xff0c;进程由操作系统调度&#xff1b;进程切换需要的资源很最大&#xff0c;效率低。 对于操作系统来说&#xff0c;一个任务就是一个进程&#xff08;Process&#xff09;&#xff…

ComfyUI安装调用DeepSeek——DeepSeek多模态之图形模型安装问题解决(ComfyUI-Janus-Pro)

ComfyUI 的 Janus-Pro 节点&#xff0c;一个统一的多模态理解和生成框架。 试用&#xff1a; https://huggingface.co/spaces/deepseek-ai/Janus-1.3B https://huggingface.co/spaces/deepseek-ai/Janus-Pro-7B https://huggingface.co/spaces/deepseek-ai/JanusFlow-1.3B 安装…

UE求职Demo开发日志#22 显示人物信息,完善装备的穿脱

1 创建一个人物信息显示的面板&#xff0c;方便测试 简单弄一下&#xff1a; UpdateInfo函数&#xff1a; 就是获取ASC后用属性更新&#xff0c;就不细看了 2 实现思路 在操作目标为装备栏&#xff0c;或者操作起点为装备栏时&#xff0c;交换前先判断能否交换&#xff08;只…