【C++】深入理解List:双向链表的应用

凭时间赢来的东西,时间肯定会为之作证。 

前言 

  这是我自己学习C++的第七篇博客总结。后期我会继续把C++学习笔记开源至博客上。

  上一期笔记是关于C++的vector类知识,没看的同学可以过去看看:【C++】探索Vector:灵活的数据存储解决方案-CSDN博客https://blog.csdn.net/hsy1603914691/article/details/145553176

list类的介绍 

1. 在使用list类时,必须包含 #include <list> 这一行。

2. string类的底层其实是一个储存字符的顺序表结构,而vector类的底层是一个顺序表模板,使用时需要显示实例化,而list类的底层是一个双向链表模板,使用时也需要显示实例化,后面的笔记中以整形为例。

3. 下面是list类的官方文本介绍,里面有详细的用法讲解。

cplusplus.com/reference/list/list/?kw=listhttps://cplusplus.com/reference/list/list/?kw=list

list类对象的常见构造  

1. list<int> l1,什么也不需要传入,构造一个空的list类对象

2. list<int> l2(n,num),构造一个list类对象,里面包含n个num整形

3. list<int> l3(l2.begin(),l2.end()),使用另一个list类对象进行迭代器构造

4. list<int> l4(l3),使用另一个list类对象进行构造

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> l1;
	list<int> l2(5, 1);
	list<int> l3(l2.begin(), l2.end());
	list<int> l4(l3);
	for (auto a : l1)
	{
		cout << a << " ";
	}
	cout << endl;
	for (auto a : l2)
	{
		cout << a << " ";
	}
	cout << endl;
	for (auto a : l3)
	{
		cout << a << " ";
	}
	cout << endl;
	for (auto a : l4)
	{
		cout << a << " ";
	}
	cout << endl;
	return 0;
}
//
//1 1 1 1 1
//1 1 1 1 1
//1 1 1 1 1

1. list类对象的初始化分为两种。 

2. 如果使用号,则为拷贝初始化;如果不使用号,则为直接初始化。 

3. list类对象的初始化时,需要使用大括号包裹初始化值。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> l1 = { 1,2,3,4,5 };
	list<int> l2({ 5,6,7,8,9 });
	for (auto a : l1)
	{
		cout << a << " ";
	}
	cout << endl;
	for (auto a : l2)
	{
		cout << a << " ";
	}
	cout << endl;
	return 0;
}

list类对象的容量操作 

1. list.size(),返回list类对象有效节点的个数。

2. list.empty(),检测list类对象有效大小是否为0为0返回true不为0返回flase

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> l1 = { 1,2,3,4,5 };
	list<int> l2({ 5,6,7,8,9 });
	cout << l1.size() << endl;//5
	cout << l2.empty() << endl;//0
	return 0;
}

list类对象的修改操作

1. list.push_back(num),在list类对象尾插整数num

2. list.pop_back(),在list类对象尾删

3. list.push_front(num),在list类对象首元素之前插入一个元素num

4. list.pop front(),删除list类对象首元素

5. list.insert(pos_iterator,n,num)在下标为pos位置的元素的前面插入n个数字num

6. list.erase(pos_iterator),删除下标为pos位置的元素的上的数字,如果需要删除一串数字,则再给一个截至迭代器

7. list.swap(v2),交换两个list类对象的值

list类对象的返回值操作

1. list.front(),返回list类对象第一个节点值引用

2. list.back(),返回list类对象最后一个节点值引用

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> l1 = { 1,2,3,4,5 };
	cout << l1.front() << endl;
	cout << l1.back() << endl;
	return 0;
}

list类对象的遍历操作

1. 由于vector类对象string类对象的底层都是顺序表,所以[ ]都可以进行重构;而list类对象的底层是链表,所以[ ]不能进行重构,即无法使用

2. list.begin()list.end()vector.begin()获取第一个节点的迭代器,string.end()获取最后一个节点的下一个位置的迭代器。

3. list.rbegin()list.rend()list.rbegin()获取头节点的迭代器,vector.rend()获取第一个节点的迭代器。

4. 注意反向迭代器进行迭代的步骤也是++,反向迭代器是用来反向遍历链表的。 

5. 范围for循环,用于有范围的集合进行遍历,C++11中引入了基于范围的for循环for循环中的括号由冒号" : "分为两部分:第一部分是用于迭代的变量 (可以使用auto让编译器自动判断变量类型),第二部分则表示被迭代的范围。(自动迭代,自动取数据,自动判断结束。

6. 范围for循环,如果需要对范围对象进行修改,则使用auto&来修饰迭代的变量;如果需要对较大的目标对象进行遍历,也可以使用auto&来修饰迭代的变量。

7. 范围for循环,是用于遍历容器的,它的底层也是迭代器。(数组也可以用范围for循环。

//迭代器
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> l1 = { 1,2,3,4,5 };
	auto lt = l1.begin();
	while (lt != l1.end())
	{
		cout << *lt << " ";
		lt++;
	}
	return 0;
}
//反向迭代器
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> l1 = { 1,2,3,4,5 };
	auto lt = l1.rbegin();
	while (lt != l1.rend())
	{
		cout << *lt << " ";
		lt++;
	}
	return 0;
}
//for循环
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> l1 = { 1,2,3,4,5 };
	list<int> l2({ 5,6,7,8,9 });
	for (auto a : l1)
	{
		cout << a << " ";
	}
	cout << endl;
	for (auto& a : l2)
	{
		cout << a << " ";
	}
	cout << endl;
	return 0;
}

致谢

  感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能! 

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

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

相关文章

Spring Cloud源码 - Eureka源码原理分析

Eureka源码原理分析 文章目录 Eureka源码原理分析一&#xff1a;启动过程源码1&#xff1a;初始化环境2&#xff1a;初始化上下文2.1&#xff1a;加载erueka-server配置文件2.2&#xff1a;构造实例信息管理器2.3&#xff1a;初始化erueka-client2.4&#xff1a;处理注册相关的…

2.23操作列表

操作列表 一&#xff1a;遍历整个列表 – for循环 names[xixi, gofy, haha] for name in names:print(f"{name} is very very good good")print(f"{name}&#xff0c;欢迎回家\n")xixi is very very good good xixi&#xff0c;欢迎回家gofy is very ver…

Solidity study

Solidity 开发环境 Solidity编辑器&#xff1a;Solidity编辑器是一种专门用于编写和编辑Solidity代码的编辑器。常用的Solidity编辑器包括Visual Studio Code、Atom和Sublime Text。以太坊开发环境&#xff1a;以太坊开发环境&#xff08;Ethereum Development Environment&am…

Git版本控制系统---本地操作(万字详解!)

目录 git基本配置 认识工作区、暂存区、版本库 添加文件--情况一&#xff1a; 添加文件-情况二: 修改文件: 版本回退&#xff1a; git基本配置 1.初始化本地仓库&#xff0c;注意&#xff1a;一定要在一个目录下进行&#xff0c;一般都是新建一个文件夹&#xff0c;在文件…

IDEA配置JSP环境

首先下载IDEA2021.3&#xff0c;因为最新版本不能简单配置web开发环境。然后新建一个java开发项目&#xff1a; 然后右键创建的项目&#xff0c;添加web框架&#xff1a; 选择web appliciation 在web inf文件夹下创建classes和lib文件夹&#xff1a; 点击file &#xff0c;选择…

前端兼容处理接口返回的文件流或json数据

参考文档&#xff1a;JavaScript | MDN 参考链接&#xff1a;Blob格式转json格式&#xff0c;拿到后端返回的json数据_blob转json-CSDN博客 参考链接&#xff1a;https://juejin.cn/post/7117939029567340557 场景&#xff1a;导入上传文件&#xff0c;导入成功&#xff0c;…

短剧源码部署搭建小程序搭建IAA+IAP混合解锁模式

在当今数字化内容消费迅速增长的时代&#xff0c;短剧作为一种新兴的内容形式&#xff0c;凭借其短小精悍、节奏紧凑的特点&#xff0c;迅速吸引了大量用户。作为一名软件体验测试人员&#xff0c;我有幸体验了一款集创新与实用为一体的短剧小程序。这款小程序不仅在前端用户体…

网络原理---HTTP/HTTPS

通过之前的网络编程&#xff0c;我们已经初步了解UDP和TCP的基本实现方法&#xff0c;接下来我们对其进一步的学习。 在网络编程中&#xff1a; 1.读和写数据通过Socket&#xff0c;通过Socket内置的InputStream和OutputStream(读写的基本单位都是字节&#xff09;。2.当在编…

【Python修仙编程】(二) Python3灵源初探(2)

第一部分&#xff1a;林羽的修仙之旅——字符串与布尔类型的修炼 林羽站在练气期一阶的起点&#xff0c;望着手中的《Python无极心法》秘籍&#xff0c;心中充满了期待。师傅玄天真人在一旁微笑着说道&#xff1a;“林羽&#xff0c;今天我们要修炼的是‘字符串’和‘布尔类型…

【HTML— 快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器&#xff0c;我们在写前端代码时&#xff0c;使用 Sublime Text 打开比使用记事本打开&#xff0c;得到的代码体验更好&#xff0c;比 vscode…

pipeline 使用git parameter插件实现动态选择分支构造

效果&#xff0c;&#xff0c;点击build with Parameters 就会出现右边的当前仓库的所有的分支&#xff0c;默认最多显示5个&#xff0c;可以修改配置&#xff0c;修改显示的最大分支数量。如果分支太多&#xff0c;可以通过右边的过滤框输入过滤。 安装git params插件 搜索g…

国产OS上完整编译Qt5.15、搭建基本开发环境需要的库

近期有师弟问我国产OS安装Qt5.15编译老是不完整&#xff0c;不是没声音&#xff0c;就是没视频&#xff0c;或者没有xcb。通过QEMU模拟Arm64&#xff0c;闲来20几天摸索&#xff0c;完整编译了Qt5.15&#xff0c;并编译成功了我的SDR玩具taskBus。 1.主要结论&#xff1a; 该O…

数据库 安装initializing database不通过

出现一下情况时&#xff1a; 处理方法&#xff1a; 将自己的电脑名称 中文改成英文 即可通过

【视频2 - 4】初识操作系统,Linux,虚拟机

&#x1f4dd;前言说明&#xff1a; ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;主要跟随B站博主灵茶山的视频进行学习&#xff0c;专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。…

AI绘画软件Stable Diffusion详解教程(2):Windows系统本地化部署操作方法(专业版)

一、事前准备 1、一台配置不错的电脑&#xff0c;英伟达显卡&#xff0c;20系列起步&#xff0c;建议显存6G起步&#xff0c;安装win10或以上版本&#xff0c;我的显卡是40系列&#xff0c;16G显存&#xff0c;所以跑大部分的模型都比较快&#xff1b; 2、科学上网&#xff0…

将Ubuntu操作系统的安装源设置为阿里云

在使用Ubuntu操作系统时,默认的软件源通常是国外的仓库,这可能会导致软件安装和更新速度较慢。为了提高下载速度和稳定性,我们可以将Ubuntu的安装源设置为阿里云镜像源。以下是详细步骤: 一、准备工作 在开始之前,请确保您的Ubuntu系统可以正常上网,并且您拥有管理员权…

IP-------GRE和MGRE

4.GRE和MGRE 1.应用场景 现实场景 居家工作&#xff0c;公司工作&#xff0c;分公司工作----------需要传输交换数据--------NAT---在该场景中需要两次NAT&#xff08;不安全&#xff09; 为了安全有两种手段-----1.物理专线---成本高 2.VPN--虚拟专用网---隧道技术--封装技…

Visual Studio Code 跨平台安装与配置指南(附官方下载链接)

一、软件定位与核心功能 Visual Studio Code&#xff08;简称VS Code&#xff09;是微软开发的开源跨平台代码编辑器&#xff0c;支持超过50种编程语言的智能补全、调试和版本控制功能。2025版本新增AI辅助编程模块&#xff0c;可自动生成单元测试代码和API文档注释。 二、下载…

小智AI桌宠机器狗

本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…

Linux:进程信号(二.信号的保存与处理、递达、volatile关键字、SIGCHLD信号)

目录 1.信号保存 1.1递达、未决、阻塞等概念 1.2再次理解信号产生与保存 1.3信号集操作函数 sigset_t类型 sigemptyset() 函数 sigismember()函数 sigaddset ()函数 sigdelset() 函数 sigprocmask()系统调用 sigpending()系统调用 2.信号的处理/递达 2.1信号处理时…