C++STL——list

C++教学总目录

list

  • 1、list简介
  • 2、构造函数
  • 3、迭代器
  • 4、访问和容量函数
  • 5、修改类函数
  • 6、操作类函数

1、list简介

在这里插入图片描述
list是带头双向循环链表,也是模板类,使用时要指明类型,包含于头文件<list>
由于list是双向循环链表,在任意位置的插入删除的效率非常高,都是O(1),所以list提供了头插头删和尾插尾删的接口。

2、构造函数

在这里插入图片描述
第一个就是默认构造函数,第二个支持用n个val来初始化链表,第三个支持迭代器区间初始化,最后一个就是拷贝构造函数了。使用如下:

string s = "hello world";
list<int> lt1;			// 默认构造函数
list<int> lt2(10, 1);	// 创建10个结点赋值为1
list<int> lt3(lt2.begin(), lt2.end()); // 同类型迭代器区间初始化
list<char> lt4(s.begin(), s.end());    // 使用string的迭代器区间初始化
list<int> lt5(lt2);     // 拷贝构造

3、迭代器

在这里插入图片描述

list的迭代器使用方法同vector和string。所以只要学会一种类型的迭代器使用,其他类型迭代器都会使用了。
但是list的迭代器和vector、string的迭代器有所不同。

algorithm库中有三个常用的函数:reverse、sort、find。先来看看这三个函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
观察这三个函数,你会发现他们的模板参数取名是不同的。
实际上这三个函数并不是任何容器的迭代器都可以使用的,他们是有区别的。

迭代器有三种类型:单向迭代器、双向迭代器、随机迭代器。
在这里插入图片描述
从这三个函数的模板参数命名也可以看出来,find传单向迭代器就可以使用,sort需要传随机迭代器,reverse需要传双向迭代器。
基于list底层的性质,list只能是双向迭代器,所以不能使用sort对list进行排序,因为sort需要随机迭代器。
而像vertor和string底层都是指针,可以对指针++/–/+/-,所以它们的迭代器都是随机迭代器,上面三个函数都可以使用。

下面遍历list:

list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);
// 使用迭代器遍历list
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}
cout << endl;// 使用范围for遍历list——底层还是迭代器
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

4、访问和容量函数

在这里插入图片描述
empty判断链表是否为空。
size返回链表中结点个数。
max_size表示链表可以存储的最多结点——不同平台下不同,没什么意义
front返回链表头结点元素
back返回链表尾结点元素

5、修改类函数

在这里插入图片描述
1、assign函数就是把链表中所有结点清空,然后重新初始化。
在这里插入图片描述

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> lt2(10, 1);
lt2.assign(lt.begin(), lt.end());
lt2.assign(10, 2);

2、push_front是头插,pop_front是头删,push_back是尾插,pop_back是尾删。

3、insert函数:支持在某个位置插入一个数据、支持在某个位置插入n个数据、支持在某个位置插入一段迭代器区间。
在这里插入图片描述
insert的使用这里就不介绍了,详情可以看之前的string和vector,string和vector会用这里肯定也会用。现在来思考一下list的迭代器insert之后会失效吗?
在这里插入图片描述
观察这段代码,it指向3,当调用insert之后,在3的前面插入了10,然后再对it所指向的元素做修改,之后打印输出我们发现3确实被改成100了。所以list这里insert之后迭代器并不会失效,因为这里插入是new一个结点然后进行前后连接。而之前vector那里可能会发生扩容,扩容后迭代器就失效了。
insert的返回值是插入新元素的迭代器。

4、erase函数:支持删除某个位置的元素、支持删除一段迭代器区间

在这里插入图片描述
erase之后迭代器会失效吗?答案肯定是会失效,因为指向的那个结点空间被释放了,所以迭代器失效。所以erase返回值是删除元素的下个位置。

5、swap函数就是交换两个list的值,类似前面vector和string。clear就是清除所有数据。resize也是类型vector的,开空间+初始化。


6、操作类函数

在这里插入图片描述
1、reverse函数就是逆置,这里其实可以直接使用算法库的reverse函数逆置,没必要在list中再实现reverse函数。

2、sort函数是用来给list中数据排序的,因为算法库中的sort函数得是随机迭代器才能使用,而list是双向迭代器,所以不能使用算法库中的sort函数,因此在list类实现了sort函数,这个函数使用的是归并排序。但是这个函数的效率非常低,如果在数据量比较大的情况下,我们可以把数据拷贝到vector中存储,然后使用算法库中的sort快排,再把数据拷回list中,这样的效率更高。
在这里插入图片描述

3、merge函数用来合并两个链表:
在这里插入图片描述
使用如下:

std::list<double> first, second;first.push_back(3.1);
first.push_back(2.2);
first.push_back(2.9);second.push_back(3.7);
second.push_back(7.1);
second.push_back(1.4);
first.sort();
second.sort();
first.merge(second);
cout << "first:";
for (const auto& e : first)
{cout << e << " ";
}
cout << endl;
cout << "second:";
for (const auto& e : second)
{cout << e << " ";
}
cout << endl;

调用了merge之后,将second中的所有结点合并到first链表中,second中就没有结点了。当然merge函数的使用前提是两个链表都有序。

4、unique函数用来去重:如果链表中有多个相同的数据,可以使用unique来去重
在这里插入图片描述
使用unique的前提也是链表必须有序。

5、remove_if是给一个函数,然后把满足条件的值全部去掉。
在这里插入图片描述
使用如下:
在这里插入图片描述
这里我们实现了一个test函数,当x<10时返回true。我们在调用remove_if时将函数地址传过去,当满足条件时——返回true时就将元素删掉。所以小于10的元素全部被去除了。

6、remove函数很简单,就是把你所给的值的元素删掉。
在这里插入图片描述

7、splice函数是拼接(更形象来说时转移):支持在某个位置拼接list、支持在某个位置拼接list对象的某个结点、支持在某个位置拼接list的一段迭代器区间
在这里插入图片描述
使用如下:

#include <iostream>
#include <vector>
#include <string>
#include <list>using namespace std;int main()
{list<int> mylist1, mylist2;list<int>::iterator it;for (int i = 1; i <= 4; ++i)mylist1.push_back(i);      // mylist1: 1 2 3 4for (int i = 1; i <= 3; ++i)mylist2.push_back(i * 10);   // mylist2: 10 20 30for (auto e : mylist1){cout << e << " ";}cout << endl;for (auto e : mylist2){cout << e << " ";}cout << endl << endl;it = mylist1.begin();it++;// 全部转移到mylist1mylist1.splice(it, mylist2);for (auto e : mylist1){cout << e << " ";}cout << endl;for (auto e : mylist2){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述
上面的代码将mylist2中的所有结点转移到了mylist1中第一个结点的后面。

把上面调用splice的语句换成:

// 部分转移
mylist1.splice(it, mylist2, ++mylist2.begin());

在这里插入图片描述
现在就变成了将mylist2中第二个结点转移到mylist1的第一个结点后面。

我们再把代码换成:

mylist1.splice(mylist1.begin(), mylist1, ++mylist1.begin(), mylist1.end());

现在是把mylist1中第一个结点后面的所有结点转移到mylist1的第一个结点前面。
需要注意的是:使用splice进行转移时,可以对同一个list进行转移,但是要保证区间不能重叠,如果区间重叠就会出问题。

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

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

相关文章

unocss 添加支持使用本地 svg 预设图标,并支持更改大小

安装 pnpm install iconify/utils 在配置文件 unocss.config.ts&#xff1a; presets > presetIcons 选项中 通过 FileSystemIconLoader 加载本地图标&#xff0c;并指定目录。 import presetWeapp from unocss-preset-weapp import { extractorAttributify, transformer…

转换流详解

在Java中&#xff0c;处理文本数据时&#xff0c;我们经常需要将字节流转换为字符流&#xff0c;或者将字符流转换为字节流。这种转换通常用于读取文本文件或将数据从网络传输到应用程序。Java提供了两种主要的转换流&#xff1a;InputStreamReader 和 OutputStreamWriter。 1…

广东网站设计提升你网站在搜索引擎中的排名

在当今网络盛行的时代&#xff0c;拥有一个设计优良的网站&#xff0c;对企业的在线发展至关重要。特别是对于广东地区的企业来说&#xff0c;网站设计不仅仅是美观的问题&#xff0c;更直接影响着搜索引擎中的排名。因此&#xff0c;精心策划和设计的网站&#xff0c;能够显著…

VisualStudio远程编译调试linux_c++程序(二)

前章讲述了gdb相关&#xff0c;这章主要讲述用VisualStudio调试编译linux_c程序 1&#xff1a;环境 win10 VisualStudio 2022 Community ubuntu22.04 2:安装 1>vs安装时&#xff0c;勾选 使用c进行linux 和嵌入式开发 (这里以vs2022为例) OR VS安装好了&#xff0c; 选择工…

Netty 常见组件介绍

Netty 常见组件介绍 上篇文章Netty入门程序echo 基本包含了Netty常见的组件&#xff0c;本文分别介绍各个组件 Bootstrap or ServerBootstrapEventLoopEventLoopGroupChannelPipelineChannelFuture or ChannelFutureChannelInitializerChannelHandler Bootstrap vs ServerBo…

el-talble selection行 初始默认勾选

导言 el-talble selection 行&#xff08;选择列&#xff09;用于显示复选框&#xff0c;让用户可以选择或取消选择某些表格行&#xff0c;常用于批量操作场景。 刚刚试了下&#xff0c;想加深印象记录一下当学习碎片。参考的是表格多选并根据每行值初始化选中状态&#xff08;…

HTML 块级元素和内联(行内)元素详解

在 HTML 中,元素根据它们在页面中的表现方式分为两类:块级元素 和 内联元素(行内元素)。了解块级元素和内联元素的特性与使用方法,是掌握HTML开发的重要基础。本文将深入探讨这两类元素的特点及其在实际开发中的应用。 文章目录 一、块级元素1.1 块级元素是什么?1.2 块级…

使用Docker构建和部署微服务

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 [TOC] Docker 是一个开源的容器化平台&#xff0c;可以帮助开发者轻松构建、打包和部署应用程序。本文将详细介绍如何使用 Dock…

conda下jupyterlab安装问题以及交互绘图问题记录

安装 1. 直接conda install jupyterlab就好&#xff0c;只要在base环境下安装就行&#xff0c;可以在任意环境下执行jupyter lab启动。 2. 打开jupyter lab后显示Could not determine jupyterlab build status without nodejs&#xff0c;可以执行conda install nodejs安装no…

springcloud整合sentinel,限流策略持久化到nacos,详细配置案例

目录 1.组件下载和启动 &#xff08;1&#xff09;sentinel-dashboard下载 &#xff08;2&#xff09;nacos下载 &#xff08;3&#xff09;jmeter下载 &#xff08;4&#xff09;redis下载&#xff08;与流控关系不大&#xff0c;与项目启动有关&#xff09; 2.本微服务项…

【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃

引言 在数字化办公的浪潮中&#xff0c;ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案&#xff0c;赢得了全球用户的青睐。随着 8.2 版本的发布&#xff0c;ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF&#xff1a;团队合…

Java爬虫:在1688上“照片快递”上传图片

想象一下&#xff0c;你是一名快递小哥&#xff0c;不过你送的不是包裹&#xff0c;而是图片——而且是用Java编写的爬虫作为你的快递车&#xff0c;将图片快速准确地送到1688的服务器上。今天&#xff0c;我们将一起化身为代码界的“照片快递”&#xff0c;使用Java爬虫技术&a…

深入探索ReentrantLock(三):限时锁申请的艺术

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 前言 一、ReentrantLock限时锁申请 1.限时锁申请的必要性 2.tryLock(long time, TimeUnit unit) 方法讲解 3.限时锁的优势与注意事项 4.tryLock(long time, TimeUnit unit)案例 总结 前言 Java并…

初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 wait、notify 方法 多线程练习 单例模式 饿汉模式 懒汉模式 指令重排序 wait、notify 方法 wait 和 我们前面学习的sleep…

在线预览 Word 文档

引言 随着互联网技术的发展&#xff0c;Web 应用越来越复杂&#xff0c;用户对在线办公的需求也日益增加。在许多业务场景中&#xff0c;能够直接在浏览器中预览 Word 文档是一个非常实用的功能。这不仅可以提高用户体验&#xff0c;还能减少用户操作步骤&#xff0c;提升效率…

C++ 优先算法 —— 查找总价格为目标值的两个商品(双指针)

目录 题目 &#xff1a;查找总价格为目标值的两个商品 1. 题目解析 2. 算法原理 Ⅰ 暴力枚举 Ⅱ 双指针算法 3. 代码实现 暴力枚举 双指针算法 题目 &#xff1a;查找总价格为目标值的两个商品 1. 题目解析 题目截图&#xff1a; 这道题的一个关键的地方&#xff0c;它先…

Qt QCheckBox、QPushButton和QRadioButton详解

QCheckBox&#xff08;复选框&#xff09; 功能&#xff1a;QCheckBox用于创建一个复选框控件&#xff0c;允许用户从多个选项中选择多个。 属性&#xff1a; checkable&#xff1a;决定复选框是否可以被选中或取消选中。checked&#xff1a;表示复选框当前的选中状态&#…

自编以e为底的指数函数exp,性能接近标准库函数

算法描述&#xff1a; (1). 先做自变量x的范围检查&#xff0c;对于双精度浮点数&#xff0c;自变量不能超出(-1022ln2, 1024ln2)(-708.39, 709.78)&#xff0c;否则exp(x)会溢出。对于单精度浮点数&#xff0c;自变量不能超出(-126ln2, 128ln2)(-87.33, 88.72). 自己使用此函数…

数据结构-二叉树中的递归

目录 前言 简单手撕二叉树 二叉树节点的求解 二叉树叶子节点的求解 二叉树高度 二叉树第K层节点的个数 二叉树查找值为X的节点 结束语 前言 在这里说声抱歉&#xff0c;好久没更新数据结构了&#xff0c;二叉树的相关内容还没有更新完&#xff0c;是小编的失职&#xff…

在基于AWS EC2的云端k8s环境中 搭建开发基础设施

中间件下载使用helm,这里部署的都是单机版的 aws-ebs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:name: aws-ebs-storageclass provisioner: kubernetes.io/aws-ebs parameters:type: gp2 # 选择合适的 EBS 类型&#xff0c;如 gp2、io1…