从C语言到C++_16(list的介绍和常用接口函数)

news2024/12/23 10:26:04

目录

1. list 介绍和简单使用

1.1 list介绍

1.2 list简单接口函数

1.3 push_back 和遍历

1.4 list常规接口函数使用

2. list 的其它接口函数

2.1 splice 接合 

2.2 remove 删完一个值

2.3 sort和reverse

本章完。


list是个双向带头循环链表。

带头双向循环链表我们在数据结构与算法专栏中有过详细的讲解,并且还带大家实现过:

数据结构与算法⑦(第二章收尾)带头双向循环链表的实现_GR C的博客-CSDN博客

我们知道,带头双向循环链表是非常合适任意位置的插入和删除的,时间复杂度都是O(1).

list 在实际的运用中用的没有 vector 多,包括大家在刷题的时候 list 也出现的很少,

因为 list 不支持随机访问,有很多数据堆在那里你可能还需要排序一下,list 要排序,

效率就慢一点,所以用 vector 的情况较多。

但 list 在一些场景也需用到,比如需要频繁的插入和删除,特别是需要在头尾部插入和删除。

1. list 介绍和简单使用

1.1 list介绍

像前面一样查查文档:https://cplusplus.com/reference/list/list/?kw=list

 ① list 是一个顺序容器:

是允许你在任意位置进行  插入删除的顺序容器,并提供双向迭代器。

② list的底层是双向链表结构:

双向链表中每个元素存储在互不相关的独立结点中,在结点中通过两个指针指向其前后元素。

③ list 与 forward_list 非常相似:

它们很相似,最大的不同 forward_list 是单链表,只能向前迭代(也让其因此更简单高效)。

④ 与其他的序列式容器相比(array,vector,deque):

list 通常在任意位置进行插入、移除元素的执行效率更好。

list 和 forward_list 最大的缺陷是不支持任意位置的随机访问。举个例子:

如果要访问 list 中的第 6 个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,

在这段位置上迭代需要线性的时间开销。不仅如此,list 还需要一些额外的空间,

以保存每个结点的 "相关联信息"(对于存储类型较小元素的大 list 来说这 可能是一个重要的因素)

1.2 list简单接口函数

看看构造:

 和vector差不多,看看其它接口函数:

看不懂英文又不想查的朋友看这里:

 还是和vector差不多,还有一些特有的接口没截,等下着重讲讲。简单用下上面吧:

1.3 push_back 和遍历

首先思考一个问题:我们还能用 "下标 + 方框号" 的方式遍历吗?

不行的,因为 list 是链表,是通过指针连接的, 所以  list 不支持随机访问!

而 string 和 vector 可以,是因为它底层的结构是连续的数组,它的物理结构是连续的。

void Test_push_back()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	list<int>::iterator it = lt.begin();// 迭代器遍历1到5 
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto& e : lt)// 范围for 把1到5乘2
	{
		e *= 2;
		cout << e << " ";
	}
	cout << endl;

	list<int>::reverse_iterator rit = lt.rbegin();//反向迭代器倒着遍历
	while (rit != lt.rend()) 
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
}

1.4 list常规接口函数使用

void Test_other()
{
	list<int> lt;
	lt.push_front(10);//头插四个
	lt.push_front(20);
	lt.push_front(30);
	lt.push_front(40);
	list<int>::iterator it = find(lt.begin(), lt.end(), 20);//在20前面插入50
	if (it != lt.end())
	{
		lt.insert(it, 50);
	}
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << "size = " << lt.size() << endl;

	lt.pop_back();//尾删
	lt.pop_front();//头删
	it = find(lt.begin(), lt.end(), 20);//删除20
	if (it != lt.end())
	{
		lt.erase(it);
	}
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << "size = " << lt.size() << endl;
}

2. list 的其它接口函数

因为list的存储不是连续的,库里的一些函数用不了(比如sort和reverse),

所以list提供了一些接口函数:

2.1 splice 接合 

 简单来说就是把一个链表转移到另一个链表里去:

void Test_splice()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	list<int> lt2;	
	lt2.push_back(10);
	lt2.push_back(20);
	lt2.push_back(30);
	lt2.push_back(40);
	lt2.push_back(50);

	lt1.splice(lt1.end(), lt2);//把lt2接合到lt1后面
	for (const auto& e : lt1)// 范围for遍历
	{
		cout << e << " ";
	}
	cout << endl;
}

2.2 remove 删完一个值

remove 只需要给一个元素的值,它就可以自己找自己删!

erase 还需要搞个搞个迭代器,然后还要 if 判断一下,但 remove 就不一样了:

void Test_remove()
{
	list<int> lt;
	lt.push_back(10);
	lt.push_back(20);
	lt.push_back(30);
	lt.push_back(40);

	lt.push_back(10);
	lt.push_back(20);
	lt.push_back(30);
	lt.push_back(40);
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << endl;

	// 如果存在元素,删完
	lt.remove(10);
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << endl;

	// 如果待删元素不存在,则无事发生
	lt.remove(50);
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

2.3 sort和reverse

unique是去重,但是再后面点学的set天生带去重,所以其它接口后面有机会再讲行了。

前面说到:因为list的存储不是连续的,库里的一些函数用不了(比如sort和reverse)。

但是list提供的作用和其差不多,值得注意的是库里的sort底层是快排,快排,链表是用不了的,

那list用上面排序呢?冒泡等是可以的,就是效率太低,这时归并排序就派上用场了,

而且不会多开空间。但是排序大量数据时list的排序就比快排慢了,甚至你拷贝list的数据到vector

用库里的快排,排完再拷回list的时间还要比list自己排得快,但是数据量小的话也差不多:

void Test_sort_reverse()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(20);
	lt.push_back(2);
	lt.push_back(40);
	lt.push_back(5);
	lt.push_back(10);
	lt.push_back(30);
	lt.push_back(4);
	lt.push_back(4);
	lt.push_back(50);
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << endl;

	lt.sort();
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	
	lt.reverse();// 懂我意思把
	for (const auto& e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

本章完。

list没有很好的OJ题,且一些选择题打算放在下一篇了,模拟实现之后再写好一点。

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

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

相关文章

21份软件测试全流程文档模板(标准版)

1、需求说明书 2、功能测试计划 3、功能测试用例 4、业务流程测试用例 5、系统安装配置说明书 6、阶段功能测试报告 7、性能测试计划 8、性能测试用例 9、性能测试报告 10、系统功能测试报告 11、需求变更说明书 12、用户建议说明书 13、验收测试报告 14、产品发布说明书 15、系…

redis下载安装

本文主要介绍如果在Centos7下安装Redis。 1.安装依赖 redis是由C语言开发&#xff0c;因此安装之前必须要确保服务器已经安装了gcc&#xff0c;可以通过如下命令查看机器是否安装&#xff1a; <span style"color:#000000"><span style"background-c…

Matlab论文插图绘制模板第101期—人口金字塔图

在之前的文章中&#xff0c;分享了Matlab双向柱状图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一种特殊的双向柱状图&#xff1a;人口金字塔图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自…

Lecture 17 Machine Translation

目录 Statistical MTNeural MTAttention MechanismEvaluationConclusion Machine translation (MT) is the task of translating text from one source language to another target language why? Removes language barrierMakes information in any languages accessible t…

Polarion工作流插件(自定义)

创建插件命名插件配置插件Condition&Function package com.polarion.capital.example.conditions;import com.polarion.alm.tracker.model.IWorkItem; import com.polarion.alm.tracker.workflow.IArguments; import com.polarion.alm.tracker.workflow.ICallContext; impo…

TIME_WAIT的处理方式

TIME_WAIT 是什么 TIME_WAIT 是指在 TCP 连接关闭时&#xff0c;等待所有分组确认被接收的状态&#xff0c;这个状态会持续 2MSL&#xff08;Maximum Segment Lifetime&#xff09;的时间&#xff0c;以确保所有分组都被接收。在这段时间内&#xff0c;该连接不能被重用。MSL …

Jmeter 实现 grpc服务 压测

一、Jmeter安装与配置 网上有很多安装与配置文章&#xff0c;在此不做赘述 二、Jmeter gRPC Request 插件安装 插件下载地址&#xff1a;JMeter Plugins :: JMeter-Plugins.org 将下载文件解压后放到Jmeter安装目录下 /lib/ext 然后在终端输入Jmeter即可打开 Jmeter GUI界面…

搞定“超超超难”剑桥面试数学题番外篇:ARM64汇编

0. 概览 在 有趣的小实验&#xff1a;四种语言搞定“超超超难”剑桥面试数学题 那篇博文中&#xff0c;我们使用 4 种语言&#xff08;x64汇编、C、Swift 以及 Ruby&#xff09;实现了一道算法题。 不过&#xff0c;其中的汇编语言对应的是 intel CPU 上的 x64 指令集&#x…

手把手教你如何把系统的前端页面改成vue 脚手架项目,实现前后端分离

这篇文章从零开始&#xff0c;介绍怎么把现有的一个商城的页面移动到vue脚手架项目上&#xff0c;实现前后端代码的完全分离。 首先&#xff0c;我们需要新建一个vue的脚手架的项目&#xff0c;在此之前&#xff0c;需要安装node.js 打开IntelliJ IDEA或者winR&#xff0c;输入…

【Java基础学习打卡03】计算机中数据的表示、存储与处理

目录 前言一、数据的表示1.数据与信息2.计算机中的数据3.计算机中数据的单位 二、数据的存储三、数据的处理1.进位计数值2.进制间转换 四、字符编码总结 前言 本小节主要介绍在计算机中数据的表示、存储与处理。要知道计算机内部使用二进制数据&#xff0c;也就是0和1组成的数…

STM32单片机+机智云AIoT+智能服药箱

摘要:随着我国老龄化进程的日趋加快&#xff0c;越来越多的老年人步入了快乐并充实的晚年生活。但是随着年龄的增长&#xff0c;各种医药用品也成了老年人生活的必需品&#xff0c;有人每天甚至需要在不同时间服用多种不同的药物&#xff0c;如果子女不在身边&#xff0c;老年人…

一款基于RT-Thread操作系统的自动测温+风扇自动调速+加湿+自动启停的智能风扇项目(附源码下载)

基于 RT-Thread 的智能加湿风扇 作品背景 一款基于 RT-Thread 操作系统的自动检测温湿度情况进行风扇转速自动调节&#xff0c;加湿自动启停的桌面风扇。 所用硬件&#xff1a; 主控&#xff1a;CH32V307 开发板。温湿度检测&#xff1a;AHT10 温湿度模块。风扇主体&#x…

企业开源测试项目实战(附全套实战项目教程+视频+源码)

接口测试项目 1. No matching distribution found for itypes1.1.0 Could not find a version that satisfies the requirement itypes1.1.0 (from -r requirements.txt (line 8)) (from versions: ) No matching distribution found for itypes1.1.0 (from -r requirements.…

Deepspeed Chat项目理解

ChatGPT的广泛使用促进大模型火起来了&#xff0c;深度学习人工智能开启了2.0时代&#xff0c;deepspeed chat是微软开源的大模型训练工具&#xff0c;它充分利用了deepspeed的高效训练的特点&#xff0c;能够自动化的进行多种大模型训练。 言归正传&#xff0c;在博客中我将对…

什么是大数据,常见的大数据应用领域?

现在大数据发展的如火如荼&#xff0c;也有不少小伙伴对于什么是大数据比较感兴趣&#xff0c;那么大数据在比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力…

ASP.NET Core Web API入门:创建新项目

ASP.NET Core Web API入门&#xff1a;创建新项目 一、引言二、创建新项目三、加入Startup类&#xff0c;并替换Program.cs内容四、编辑Program.cs代码五、修改控制器的路由六、运行项目 一、引言 最近闲着&#xff0c;想着没真正从0-1开发过ASP.NET Core Web API的项目&#…

Navicat for Redis 与 Navicat Premium 16.2 现已正式发布 | 释放 Redis 全部潜能

今天&#xff0c;我们正式发布 Navicat for Redis 与 Navicat Premium 16.2 两款产品。注入 Redis 能力&#xff0c;这对 Navicat 具有里程碑意义。 此次首发的 Navicat for Redis 数据库管理开发工具&#xff0c;将为 Redis 用户的日常工作带来更为便捷、高效的全新体验。同时…

XV-442-57CQB-1-10伊顿触摸屏EATON

​ XV-442-57CQB-1-10伊顿触摸屏EATON XV-442-57CQB-1-10伊顿触摸屏EATON plc的通信模块是用来完成与别的PLC&#xff0c;其他智能控制设备或计算机之间的通信。以下简单介绍FX系列通信用功能扩展板、适配器及通信模块。 &#xff08;1&#xff09;通信扩展板FX2N-232-BD…

第十五章物资需求计划

物料需求计划&#xff08;MRP&#xff09;是物料管理&#xff08;MM&#xff09;和生产计划&#xff08;PP&#xff09;的组成部分。在本章中&#xff0c;您将学习如何使用MRP来优化物流和供应链规划流程。 物料需求计划&#xff08;MRP&#xff09;是一种用途广泛、直观的计划…

44 最佳实践-性能最佳实践-裸设备映射

文章目录 44 最佳实践-性能最佳实践-裸设备映射44.1 概述44.2 配置示例 44 最佳实践-性能最佳实践-裸设备映射 44.1 概述 配置虚拟机存储设备时&#xff0c;除了将文件配置给虚拟机作为虚拟磁盘使用外&#xff0c;还可以将块设备&#xff08;物理LUN、逻辑卷等&#xff09;直…