C++入门9——list的使用

news2024/10/16 15:31:07

目录

1.什么是list?

2.list的构造 

3.list迭代器的使用(list iterator) 

4.list capacity

5.list modifiers

6.list的其他操作


1.什么是list?

在官网中,对list有这样的介绍:

Lists are sequence containers that allow constant time insert and erase operations anywhere within the sequence, and iteration in both directions.

即:list是允许在序列中的任何位置进行恒定时间的插入和删除操作的序列容器,并且可以双向迭代。 

于是对list便有这样的介绍:

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。

3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,以让其更简单高效。

4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的影响因素)

2.list的构造 

list的常见构造有:

①list()——构造空的list;

②list (size_type n, const value_type& val = value_type())——构造一个有n个值为val的元素的list;

③list (const list& x)——拷贝构造函数;

④list (InputIterator first, InputIterator last)——用[first, last)区间中的元素构造list。

#include <iostream>

#include<list>

using namespace std;

int main()
{
	list<int> l1;//①构造空的list
	list<int> l2(4, 200);//②构造一个有n个值为val的元素的list
	list<int> l3(l2);//③l2拷贝构造l3
	list<int> l4(l2.begin(), l2.end());//用l2的[begin(),end())构造l4

	//范围for遍历l1、l2、l3、l4
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	for (auto e : l2)
	{
		cout << e << " ";
	}
	cout << endl;
	for (auto e : l3)
	{
		cout << e << " ";
	}
	cout << endl;
	for (auto e : l4)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

3.list迭代器的使用(list iterator) 

在之前的文章中我们就说过,可以将迭代器看做一个指针(当然底层并不完全是指针),在这里,我们理解为该指针指向list中的某个节点。

①begin+end——返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器;

②rbegin+rend——返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的 reverse_iterator,即begin位置。

#include <iostream>

#include<list>

using namespace std;

int main()
{
	list<int> l;
	l.push_back(1);
	l.push_back(2);
	l.push_back(3);
	l.push_back(4);

	//注意list只能用范围for和迭代器访问

	//使用正向迭代器访问l中的元素
	list<int>::iterator it = l.begin();
	{
		while (it != l.end())
		{
			cout << *it << " ";
			++it;
		}
		cout << endl;
	}
	
	//使用反向迭代器访问l中的元素
	list<int>::reverse_iterator rit = l.rbegin();
	{
		while (rit != l.rend())
		{
			cout << *rit << " ";
			++rit;
		}
		cout << endl;
	}
	return 0;
}

4.list capacity

①empty——检测list是否为空,是返回true,否则返回false;

②size——返回list中有效节点的个数。

 

#include <iostream>

#include<list>

using namespace std;

int main()
{
	list<int> l;
	l.push_back(1);
	l.push_back(2);
	l.push_back(3);
	l.push_back(4);

	if (!l.empty())
	{
		cout << l.size() << endl;
	}
	return 0;
}

5.list modifiers

①push_front——在list首元素前插入值为val的元素;

②pop_front——删除list中第一个元素;

③push_back——在list尾部插入值为val的元素;

④pop_back——删除list中最后一个元素;

⑤insert——在list position 位置中插入值为val的元素;

⑥erase——删除list position位置的元素;

⑦swap——交换两个list中的元素;

⑧clear——清空list中的有效元素。

#include <iostream>

#include<list>

using namespace std;

int main()
{
	list<int> l(4, 200);

	l.push_front(100);//在list首元素前插入值为val的元素;
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;
	l.pop_front();//删除list中第一个元素;
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;
	l.push_back(300);//在list尾部插入值为val的元素;
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;
	l.pop_back();//删除list中最后一个元素;
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;
	l.insert(++l.begin(), 150);//在begin()+1位置插入150
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;
	l.erase(++l.begin());//删除begin()+1位置的数据
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;
	list<int> ll(3, 100);
	cout << "交换前l=";
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << "ll=";
	for (auto e : ll)
	{
		cout << e << " ";
	}
	cout << endl;
	l.swap(ll);//交换l与ll的元素
	cout << "交换后l=";
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << "ll=";
	for (auto e : ll)
	{
		cout << e << " ";
	}
	cout << endl;
	l.clear();
	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

6.list的其他操作

 ①reverse——对list逆置;

②sort——对list排序;

③merge——将两个有序list归并为一个有序的list(无序时可调用sort先排序);

④unique——去重(去重要求所有相同的值要相邻,所以在使用unique之前最好也先调用sort);

⑤remove——相当于find+erase;

#include <iostream>
#include <list>

using namespace std;

int main()
{
	list<int> l1;
	l1.push_back(4);
	l1.push_back(2);
	l1.push_back(3);
	l1.push_back(1);
	cout << "排序前:";
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	l1.sort();//排序
	cout << "排序后:";
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	l1.reverse();
	cout << "逆置后:";//逆置
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

	list<int> l2,l3;
	l2.push_back(4);
	l2.push_back(2);
	l2.push_back(3);
	l2.push_back(1);
	l3.push_back(4);
	l3.push_back(4);
	l3.push_back(5);
	l3.push_back(7);
	l2.sort();
	l3.sort();
	l2.merge(l3);//归并
	for (auto e : l2)
	{
		cout << e << " ";
	}
	cout << endl;
	l2.unique();//去重
	for (auto e : l2)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

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

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

相关文章

如何在VSCODE中查看西门子PLC的SCL程序?

如何在VSCODE中查看西门子PLC的SCL程序? 首先,下载并安装VSCODE, 安装完成后,默认为英文界面,点击左侧扩展栏,搜索中文语言包,并点击安装,安装完成后会提示重启,重启之后就会显示中文, 同样,在扩展中搜索SCL插件包,并点击安装, 安装完成之后,可以新建一个文本文件…

在 Elastic 8.15 中使用最少的代码快速构建 RAG

作者&#xff1a;来自 Elastic Han Xiang Choong Elastic 8.15 已经发布&#xff0c;语义搜索比以往任何时候都更容易实现。 我们将介绍如何在 15 分钟内完成所有这些任务&#xff1a; 将你的文档存储在某些数据存储服务中&#xff0c;例如 AWS S3 Bucket设置 Elastic Search…

java项目docker部署时进行热部署

本文需要pontwiner进行配合操作 1.上传文件到对应服务器&#xff0c;可以通过xftp等文件上传工具进行文件上传 2.获取docker imagId XX为项目部署名称 例如&#xff1a;test-server docker ps -a |grep XX 3.复制文件到docker容器的/tmp目录下 docker cp XXXX.class im…

做seo要注意的各种细节,你都注意到了吗

在实施seo时&#xff0c;关注各种细节是至关重要的。 这些细节始于网站的初始设计&#xff0c;包括选择合适的主机、规划网站结构、优化网站内容&#xff0c;以及建立内部和外部链接的策略等。此外&#xff0c;确保网站对搜索引擎友好&#xff0c;涵盖从URL的设计到内容的优化…

kafka的安装和启动

一、kafka介绍 1&#xff0c;kafka简单介绍 kafka是一款分布式、支持分区的、多副本&#xff0c;基于zookeeper协调的分布式消息系统。最大的特性就是可以实时处理大量数据来满足需求。 2&#xff0c;kafka使用场景 1&#xff0c;日志收集&#xff1a;可以用kafka收集各种服务…

使用 Docker 部署和运行 RabbitMQ

使用 Docker 部署和运行 RabbitMQ 在本篇博客中&#xff0c;我将介绍如何通过 Docker 来运行 RabbitMQ 并使用其管理界面。还会讨论我在操作过程中遇到的常见问题及其解决方案。RabbitMQ 是一个开源的消息代理&#xff0c;用于跨应用程序发送、接收消息。在容器化环境中运行 R…

使用sysbench 简单测试io

sysbench最新版本地址 GitHub - akopytov/sysbench: Scriptable database and system performance benchmark centos在线安装 curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench 查看sysben…

vue3+ts封装类似于微信消息的组件

组件代码如下&#xff1a; <!--聊天页面-播放语言组件--> <template><div:class"[voice-message, { sent: isSent, received: !isSent }]":style"{ backgroundColor: backgroundColor }"click"togglePlayback"><!-- isSen…

解析查看elf文件的构成

x86下用clang编译一段c代码&#xff0c;编译成elf文件&#xff0c;读elf文件&#xff0c;dump出里面的所有段&#xff0c;并打印出段中的数据和含义以及汇编的内容 编写C代码 首先&#xff0c;编写一个简单的C程序&#xff0c;例如命名为example.c&#xff1a; 使用Clang编…

【YOLOv5模型部署】——TensorRT推理引擎安装与使用基于Flask的项目部署

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 温馨提示&#xff1a;对于我的电脑没有Nvidia的独显&#xff0c;只有Intel的集显&#xff0c;最后导出时无法识别Nvidia显卡设备&#xff01;&#xff01;就没成功&#xf…

Java小白一文讲清Java中集合相关的知识点(四)

LinkedList底层结构 LinkedList底层实现了双向链表和双向队列特点可以添加任意元素&#xff0c;包括null,元素可以重复线程不安全&#xff0c;没有实现同步 LinkedList底层操作机制 LinkedList底层维护了一个双向链表LinkedList中维护了两个属性first和last分别指向首结点和…

如何启动vue ui,快速创建vue项目

1.查看自己是否已经安装了vue3.0脚手架版本&#xff0c;打开cmd命令框输入vue -V(大写为查看&#xff0c;此处查看的是脚手架的版本)。如果没有提示版本&#xff0c;而是命令不存在...则要进行下面的1.1操作 1.1安装Vue CIL&#xff0c;如果已安装&#xff0c;此步忽略。安装完…

计算机毕业设计选题推荐-中华诗词文化交流平台-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

快速搭建和运行Spring Boot项目的简易指南

对于非Java开发的后端开发人员而言&#xff0c;即便未曾接触过Java&#xff0c;也可能听说过Spring Boot这一框架。若想要快速搭建并运行一个Spring Boot项目&#xff0c;可以遵循以下步骤&#xff1a; 环境准备 **安装Java JDK&#xff1a;**确保您的开发环境中安装了Java J…

Android Studio编译时各类型网络超时优化方案

我们国家有很多长城&#xff0c;我觉得最重要的除了大家耳熟能详的西起嘉峪关&#xff0c;东至山海关的万里长城&#xff0c;还有一个叫GFW的国家长城防火墙&#xff0c;这个防火墙起初仅是为了禁止用户访问政治敏感信息&#xff0c;后来逐渐强大。。。目前最新进展是我们已和世…

142.环形链表二-力扣

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *fasthead;struct ListNode *slowhead;while(fast && fast->next){fast fast->next->next;slow slow->next;if(fasts…

Python 使用中点查找矩形的角(Find Corners of Rectangle using mid points)

考虑一个矩形 ABCD&#xff0c;我们给出了边 AD 和 BC 中点&#xff08;分别为 p 和 q&#xff09;的坐标以及它们的长度 L&#xff08;AD BC L&#xff09;。现在给定参数&#xff0c;我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子&#xff1a; 输入&#xff1a;p (1,…

人工智能在病理组学和精准医疗中的最新研究进展|顶刊速递·24-09-05

小罗碎碎念 本期推文主题&#xff1a;AI病理精准医疗 这段时间一直在尝试不同的学习道路&#xff0c;兜兜转转还是觉得&#xff0c;每天跟踪最新文献其实是很有必要的&#xff0c;并且这些最新的文献不一定非要与自己专业完全匹配&#xff0c;不然就会把自己困住。 这期推文和…

文章润色太费时?试试这5款ai写作工具

你是否曾梦想拥有一个私人编辑&#xff0c;随时随地帮你打磨文字&#xff0c;让写作变得既轻松又专业&#xff1f; 告诉你一个好消息&#xff0c;现在有5款AI写作工具&#xff0c;它们就拥有这样的能力&#xff01;这些AI助手擅长润色文章&#xff0c;优化语法&#xff0c;甚至…

微信小程序使用nfc读取

** 微信小程序开发nfc读取 ** &#xff08;注释微信官方api&#xff0c;仅支持安卓&#xff0c;不支持苹果ios&#xff09;官方文档 上代demo <template><div class"nfc"><u-navbar leftIcon"arrow-leftward" bgColor"#ffffff&qu…