【C++】快速入门list的使用

news2024/11/24 22:35:21

文章目录

    • 一、引入
    • 二、构造
    • 三、迭代器
    • 四、增删查
    • 五、其他操作

一、引入

list的本质是带头双向循环链表,对于带头双向循环链表我们可是比较熟悉的了。本文只对list的一些常用接口进行说明,对于其他一些接口可自行查看文档。

image-20221128184748997


二、构造

image-20221128174148401

void Test()
{
	list<int> lt;//无参构造
	list<int> lt1(5, 1);//n个val构造
	list<int> lt2(lt1);//拷贝构造
	string s("hello world");
	list<char> lt3(s.begin(), s.end());//迭代器区间构造
}

image-20221128162440412


三、迭代器

//正向迭代器
int main()
{
	list<int> lt(5, 10);
	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

image-20221128181508877

//反向迭代器
int main()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	list<int>::reverse_iterator rit = lt.rbegin();
	while (rit != lt.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	return 0;
}

image-20221128181621471


四、增删查

1.头插头删

push_front和pop_front

int main()
{
	list<int> lt;
	lt.push_front(10);
	lt.push_front(20);
	lt.push_front(30);
	lt.push_front(40);

	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.pop_front();
	lt.pop_front();
	for (auto e : lt)
	{
		cout << e << " ";
	}
	return 0;
}

image-20221128163526170

2.尾插尾删

push_back和pop_back

int main()
{
    list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
    for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.pop_back();
	lt.pop_back();
    for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
    return 0;
}

image-20221128164421434

3.查找和插入

find和insert

find和insert可以相互配合使用。find是算法库里面的,在添加头文件#include

对于list的插入insert:

image-20221128185114278

1.通过find找到位置插入

2.找到位置后插入n个val的值

3.找到位置后插入迭代器的区间

int main()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	//1.插入一个值
	auto pos = find(lt.begin(), lt.end(), 3);
	if (pos != lt.end())
	{
		//对于链表的insert,迭代器不会失效
		lt.insert(pos, 30);
	}
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << *pos << endl;
	//2.插入n个val的值
	pos = find(lt.begin(), lt.end(), 3);
	if (pos != lt.end())
	{
		lt.insert(pos, 4, 100);
	}
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	//3.插入迭代器区间
	list<int> tmp(3, 8);
	pos = find(lt.begin(), lt.end(), 100);
	if (pos != lt.end())
	{
		lt.insert(pos, tmp.begin(), tmp.end());
	}
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

image-20221128165959241

注意:对于list的insert的pos位置不会失效,在这个地方,只是在pos位置前增加节点,改变链接,pos位置并不会变成野指针。

4.删除

erase

image-20221128174316149

int main()
{
	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(5);
	auto pos = find(lt.begin(), lt.end(), 3);
	if (pos != lt.end())
	{
		lt.erase(pos);
	}
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	pos = find(lt.begin(), lt.end(), 4);
	if (pos != lt.end())
	{
		lt.erase(pos, lt.end());
	}
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

image-20221128180604082

注意:对于list的erase的pos位置是会失效的,删除之后,如果直接进行访问会直接报错,此时的pos已经是野指针了。


五、其他操作

排序和去重

1.sort和unique

对于sort:算法库里面已经有一个sort了,而对于list自己也提供了一个sort:

算法库里的sort对于list并不适用,算法库里的sort对于物理空间是连续的,只有vector和string能够使用,而对于list来说,物理空间并不是连续的,并不适用,所以list自己提供了一个sort进行排序,此外,链表的排序是归并排序。

int main()
{
	list<int> lt;
	lt.push_back(10);
	lt.push_back(2);
	lt.push_back(5);
	lt.push_back(6);
	lt.push_back(4);
	lt.push_back(4);
	lt.push_back(6);
	lt.push_back(4);
	lt.push_back(0);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.sort();
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

image-20221128182248914

对于unique:用来删除链表中连续的重复元素,但是注意:一定是要先排完序在进行删除,如果没有进行排序:而直接进行去重的话,会导致去重去不完全

int main()
{
	list<int> lt;
	lt.push_back(10);
	lt.push_back(2);
	lt.push_back(5);
	lt.push_back(6);
	lt.push_back(4);
	lt.push_back(4);
	lt.push_back(6);
	lt.push_back(4);
	lt.push_back(0);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.sort();
	lt.unique();
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

image-20221128182606026

2.splice和remove

slice进行转移:

image-20221128182826924

int main()
{
	//转移到某个位置
	list<int> lt1(5,10);
	list<int> lt2(4,7);
	lt1.splice(lt1.begin(), lt2);
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
	//从某个位置转移
	list<int> lt3(4,10);
	list<int> lt4(4, 5);
	lt3.splice(lt3.begin(), lt4, lt4.begin());
	for (auto e : lt3)
	{
		cout << e << " ";
	}
	cout << endl;

	//迭代器区间转移
	list<int>lt5(3,10);
	list<int>lt6(3,20);
	lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end());
	for (auto e : lt5)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

image-20221128184318700

remove可以直接删除list中指定的数据:

int main()
{
	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(5);
	lt.push_back(5);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.remove(5);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

image-20221128184542076

3.resize

image-20221128190206210

感觉resize放在list这里并不太常用把,简单测试一下代码:

int main()
{
	list<int> lt;
	lt.resize(5, 1);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;

	list<int> lt2;
	lt2.push_back(1);
	lt2.push_back(2);
	lt2.push_back(3);
	lt2.push_back(4);
	lt2.push_back(5);
	lt2.push_back(6);
	lt2.resize(4);
	for (auto e : lt2)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

image-20221128190355473

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

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

相关文章

Simple Black-box Adversarial Attacks

Abstract 我们提出了一种有趣的简单方法&#xff0c;用于在黑盒环境中构建对抗性图像。 与白盒场景相比&#xff0c;构建黑盒对抗图像对查询预算有额外的限制&#xff0c;而有效的攻击至今仍是一个悬而未决的问题。 仅在连续值置信分数的温和假设下&#xff0c;我们的高效查询…

2022 计网复习简答题【太原理工大学】

考虑到在此期间&#xff0c;我可能也会发表一些与考试不相关的博文&#xff0c;为了避免大家错过考试相关内容&#xff0c;我特意弄了一个专栏《期末复习汇总》&#xff0c;大家以后可以直接到专栏里面去寻找期末复习资料。这里是计算机网络考试简答题总结&#xff0c;其余题型…

资本+商业模式+中国制造的出海跨境电商,走向世界!(Starday)

近年&#xff0c;伴随着新冠疫情的爆发&#xff0c;海外的社交隔离以及中国面对境外入关者的严格隔离政策都给中国投资者的出海投资踩下了刹车&#xff0c;出国考察及尽调都分外的艰难。但也因为这样的国际局势&#xff0c;跨境电商服务行业在海外疫情的催化下&#xff0c;中国…

PyTorch学习笔记-Non-linear Activations与Linear Layers

1. Non-linear Activations 非线性激活函数官方文档&#xff1a;Non-linear Activations。 有深度学习基础的同学应该知道最常用的非线性激活函数就是 ReLU 和 Sigmoid 函数&#xff0c;多分类问题会在输出层使用 Softmax 函数。这三个函数在 PyTorch 中分别为 nn.ReLU、nn.S…

推特自动发帖,快速提升人气

Twitter一直是所有类型企业和品牌的极其宝贵的营销工具。如果使用得当&#xff0c;它本身就能成为一种高效的营销工具。Twitter与其他社交媒体渠道&#xff0c;在营销策略以及工作方式方面略有不同&#xff0c;在品牌营销方面与利用Twitter做推广&#xff0c;就意味着随着您的动…

NNDL 作业10:第六章课后题(LSTM | GRU)

文章目录习题6-3 当使用公式(6.50)作为循环神经网络得状态更新公式时&#xff0c;分析其可能存在梯度爆炸的原因并给出解决办法.习题6-4 推导LSTM网络中参数的梯度&#xff0c;并分析其避免梯度消失的效果习题6-5 推导GRU网络中参数的梯度&#xff0c;并分析其避免梯度消失的效…

[附源码]Python计算机毕业设计Django餐馆点餐管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Apple ID 登录

Apple登录可以看做第三方登录的一种&#xff0c;即使用Apple ID登录&#xff0c;前提是你已经有了苹果开发者账号&#xff0c;直接进入主题吧。 添加App IDs 填写Bundle ID 勾选“Sign In with Apple” 创建Key 苹果将使用公钥/私钥对作为OAuth客户端机密&#xff0c;其中客…

【mongodb】重新整理mongodb中的各种操作

目录前言初始化封装基础方法增&#xff1a;向集合内添加一个文档增&#xff1a;向集合内一次添加多条文档删&#xff1a;删除一条文档删&#xff1a;删除多条文档删&#xff1a;清空某个集合的所有文档查&#xff1a;查询符合条件的文档查询某个集合内所有文档&#xff1a;定位…

python>>numpy(第二讲)

章节内容 元素操作 常用的方法 广播 数组形状操作 排序数组 目录 元素操作 一些常用的方法 广播 数组形状操作 数组排序 元素操作 生成元素a np.array([1,2,3,4]) b np.ones(4)1 生成一个原来数组的n倍生成一个所有元素均跟2次方有关的数组一个计算矩阵相乘的函数判断两个…

<Android开发> HAL层集成第三方so库

当我们需要在自己的代码中使用第三方提供的一些接口函数时&#xff0c;我们该如何加入&#xff1f;作者在写这比安文章前遇到了一个问题&#xff1a;需要在自己的HAL层中引用第三饭提供的算法库即so库&#xff1b;这个问题是作者第一次遇到&#xff0c;以往都是自己写一些代码编…

原宇宙之地产探索

前言 随着“元宇宙”的概念风靡全球&#xff0c;一股“炒房”之风也开始在元宇宙世界兴起&#xff0c;就连大家熟知的歌手林俊杰、Snoop Dogg也纷纷入局元宇宙。昂贵的元宇宙房价有些甚至高于北京的一套别墅价格。 元宇宙中的“炒房” 去年下半年&#xff0c;元宇宙房地产玩家竞…

Android Compose Bloom 项目实战 (二) : 欢迎页

1. 前言 上一篇文章我们讲到了Compose Bloom项目开发之前的一些配置及沉浸式状态栏的修改。 这篇文章接着上文&#xff0c;会介绍欢迎页的开发。 需要实现的页面效果如下所示 2. 分析页面组件 根据UI图&#xff0c;我们可以可知&#xff0c;该页面是由背景和前面部分部分组…

IDEA配置tomcat,快速部署tomcat

Tomcat简介 Tomcat是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持&#xff0c;最新的Servlet 和JSP 规范总是能在Tomcat 中得…

地震数据处理研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Kubernetes集群coredns缓存容器bind: address already in use错误导致集群服务无法互通解决

coredns缓存nodelocal dns cache :53: bind: address already in use错误处理起因分析问题处理问题重启Node local dns起因 事情起因是Kubernetes集群内的服务无法互相访问了 分析问题 因为Kubernetes集群内的服务都是通过service、pod的名称作为域名到coredns解析Cluster I…

ubuntu 18.04安装python3.7.5,并将 python 设定为python3, pip设定为pip3

ubuntu 18.04安装python3.7.5&#xff0c;并将 python 设定为python3&#xff0c; pip设定为pip3环境&#xff1a;Ubuntu 18.04.1安装步骤&#xff1a;一、安装python3.7二、安装pip3三、更改python为 python3指向&#xff0c;更改pip为pip3指向四、注意点&#xff0c;必须改回…

基于java+ssm+easyui灵悟酒店系统

✌博主介绍✌:一个致力于全战开发的代码热爱者 基于javassmeasyui灵悟酒店系统一、前言介绍&#xff1a;二、系统设计&#xff1a;2.1 系统整体架构&#xff1a;2.2 系统功能设计&#xff1a;三、功能截图&#xff1a;3.1 首页&#xff1a;3.2 用户登陆&#xff1a;3.2.1 登陆后…

【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、OpenGL的讲解 OpenGL定义了一个跨语言&#xff0c;跨平台的图形程序接口&#xff0c;对Android开发者来说&#xff0c;OpenGL就是用来绘制三维图形的技术手段&#xff0c;当然OpenGL不仅仅能够展现静止的三维图形&…

深入理解地址翻译 CSAPP

地址翻译, 用自己的话说一遍, 然后自己在draw.io画图理解. 术语 页表就是一个 页表条目&#xff08;Page Table Entry PTE)的数组&#xff0c;每一项(每个PTE)是[有效位&#xff0c;物理地址]. 我们是用VPN来标识每个PTE,但记住这些VPN并不是页表的一部分&#xff0c;不会储…