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.rhkb.cn/news/462070.html

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

相关文章

YoloV8改进策略:Block改进|RFE模块,提高小物体的识别精度|即插即用|代码+修改过程

摘要 论文介绍 本文介绍了一种基于YOLOv5的人脸检测方法,命名为YOLO-FaceV2。该方法旨在解决人脸检测中的尺度变化、简单与困难样本不平衡以及人脸遮挡等问题。通过引入一系列创新模块和损失函数,YOLO-FaceV2在WiderFace数据集上取得了优异的表现,特别是在小物体、遮挡和困…

leaflet矢量瓦片vetorgrid显示聚合和图标裁剪显示不全的问题

1、问题现象 使用leaflet显示矢量瓦片会出现图片挤压的问题和图片裁剪显示不全的问题 2、解决办法和思路 1&#xff09;数据抽稀 方法一&#xff1a;在createTile方法通过控制feature在单张瓦片里面显示的数量&#xff0c;在小层级的时候进行筛选过滤&#xff0c;对点数据类…

Gitee push 文件

1、背景 想将自己的plecs仿真放到git中管理&#xff0c;以防丢失&#xff0c;以防乱改之后丢失之前版本仿真。此操作说明默认用户已下载git。 2、操作步骤 2.1 开启Git Bash 在文件夹中右键&#xff0c;开启Git Bash。 2.2 克隆文件 在Git Bash中打git clone git地址&#…

gitee 使用 webhoot 触发 Jenkins 自动构建

一、插件下载和配置 Manage Jenkins>Plugin Manager 搜索 gitee 进行安装 插件配置 1、前往Jenkins -> Manage Jenkins -> System -> Gitee Configuration -> Gitee connections 2、在 Connection name 中输入 Gitee 或者你想要的名字 3、Gitee host URL 中…

【JavaEE初阶 — 多线程】Thread类的属性

目录 Thread类的属性 1.Thread 的常见构造方法 2.Thread 的几个常见属性 2.1 前台线程与后台线程 2.2 setDaemon() 2.3 isAlive() Thread类的属性 Thread 类是JVM 用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有一个唯一的Thread 对象与之关联&…

yocto是如何收集recipes,如何加入现有的bb文件

yocto通常是如何收集recipes: 在Yocto中&#xff0c;通过以下方式收集recipes&#xff1a; 层&#xff08;Layers&#xff09; Yocto项目使用层来组织recipes。层是包含配置文件、recipes和其他相关文件的目录结构。每个层有自己的目录&#xff0c;其中 recipes-* 目录用于存…

原生鸿蒙的竞争力到底如何?

目录 1. 崛起与挑战2. 安全机制3. 自动化检测前移4. 深入探讨开发者服务优势 1. 崛起与挑战 长期以来&#xff0c;移动操作系统市场被IOS和安卓所垄断&#xff0c;一直都难以推出完整的自主系统&#xff0c;面临诸多挑战&#xff0c;如推广困难、应用适配难度大&#xff0c;以及…

sublime Text中设置编码为GBK

要在sublime Text中设置编码为GBK&#xff0c;请按照以下步骤操作 1.打开Sublime Text编辑器, 2.点击菜单栏中的“Preferences”(首选项)选项&#xff0c;找打Package Control选项。 3.点击Package Control&#xff0c;随后搜索Install Package并点击&#xff0c;如下图 4.再…

KPRCB结构之ReadySummary和DispatcherReadyListHead

ReadySummary: Uint4B DispatcherReadyListHead : [32] _LIST_ENTRY 请参考 _KTHREAD *__fastcall KiSelectReadyThread(ULONG LowPriority, _KPRCB *Prcb)

Python爬虫:揭开淘宝商品描述的神秘面纱

在这个信息爆炸的时代&#xff0c;我们每天都在和时间赛跑。作为一名Python开发者&#xff0c;你是否曾梦想拥有超能力&#xff0c;能够瞬间揭开淘宝商品描述的神秘面纱&#xff1f;今天&#xff0c;就让我们一起化身为代码界的“福尔摩斯”&#xff0c;使用Python爬虫技术&…

HTML 多媒体标签详解:<img>、<object> 与 <embed>

文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…

台式电脑如何改ip地址:全面解析与实操指南

有时候&#xff0c;由于IP地址冲突、网络安全、隐私保护或特定应用需求&#xff0c;我们可能需要更改台式电脑的IP地址。然而&#xff0c;对于不熟悉网络设置的用户来说&#xff0c;这一过程可能显得复杂而陌生。本文将通过全面解析与实操指南&#xff0c;帮助大家轻松掌握台式…

跟着红队笔记学习 tmux:渗透测试中的多终端利器

内容预览 ≧∀≦ゞ 跟着红队笔记学习 tmux&#xff1a;渗透测试中的多终端利器进入 tmux 前的准备tmux 概念简介tmux 基础操作会话管理命令会话管理快捷键会话内和会话外命令的区别 tmux 窗口和面板管理新建和管理窗口分割窗口为面板切换面板面板放大与恢复调整面板大小关闭面板…

【机器学习】24. 聚类-层次式 Hierarchical Clustering

1. 优势和缺点 优点&#xff1a; 无需提前指定集群的数量 通过对树状图进行不同层次的切割&#xff0c;可以得到所需数量的簇。树状图提供了一个有用的可视化-集群过程的可解释的描述树状图可能揭示一个有意义的分类 缺点&#xff1a; 计算复杂度较大, 限制了其在大规模数据…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (2) - 移植 nanovg

AWTK 使用 nanovg 作为显示的后端&#xff0c;能否将 nanovg 成功移植到 HarmonyOS 上是一个关键问题&#xff0c;所以我们先尝试移植 nanovg&#xff0c;不过实际情况比预想的要简单&#xff0c;整个过程没有遇到任何意外的问题。 1. 将 AWTK 的代码取到 entry/src/main/cpp …

函数调用方法背后的原理

编译器实现函数调用时所遵循的一系列规则称为函数的“调用约定&#xff08;Calling Convention&#xff09;”&#xff0c;x86-64平台上的编译器随着操作系统的不同而有不同的约定。Windows上采用的是Wx64/Vector的标准,而类unix上采用systemV AMD64 ABI的调用标准。统一的调用…

Pinpoint(APM)进阶--插件开发

接上文 pinpoint支持编写插件来扩展监控的覆盖范围 这里重申下pinpoint一个trace的基本构成&#xff08;最小单元为span&#xff09; 插件结构 pinpoint插件由type-provider.yml 和实现组成 type-provider.yml 定义给插件使用的ServiceTypes和AnnotationKeys&#xff0c;并…

qt QPalette详解

1、概述 QPalette是Qt框架中用于管理颜色组和角色的一种机制。它允许开发者为应用程序中的不同组件&#xff08;如窗口、按钮、文本框等&#xff09;定义一套统一的颜色方案。QPalette通过定义颜色角色&#xff08;如背景色、前景色、选择色等&#xff09;和颜色组&#xff08…

什么是FUSE用户态文件系统

零. 文件系统 1. 为什么要有文件系统 文件系统是操作系统中管理文件和目录的一种机制。它提供了组织、存储、检索和更新文件的方法&#xff0c;主要如下&#xff1a; 数据组织&#xff1a;文件系统将数据组织成文件和目录&#xff0c;使用户能够更方便地管理和查找文件。每个…

<HarmonyOS第一课>应用/元服务上架的课后习题

善者&#xff0c;吾善之&#xff1b; 不善者&#xff0c;吾亦善之&#xff0c;德善。 信者&#xff0c;吾信之&#xff1b; 不信者&#xff0c;吾亦信之&#xff0c;德信。 圣人在天下&#xff0c;歙歙焉为天下浑其心&#xff0c;百姓皆注其耳目&#xff0c;圣人皆孩之。 通过&…