c++List的详细介绍
c++List详细使用
write in front
作者:@ 不进大厂不改名
专栏:@ c++
作者简介:大一学生 希望能向其他大佬和同学学习!
本篇博客简介:本文主要讲述了一种新容器list的使用方法,相信你在学了后,能够加深对STL的理解。
本章目标
1.List的介绍
2.迭代器的使用
3.list的元素获取
4.list容量相关
5.list的操作函数
6.总结
c++中List的详细介绍
- c++List详细使用
- 1.List的介绍
- 2.迭代器的使用
- 3.list的元素获取
- 4.list容量相关
- 5.list的操作函数
- 6.总结
1.List的介绍
List介绍
1.list是可以在是可以在常数范围内在任意位置插入和删除的序列式容器,并且该容器可以前后双向迭代。
这时候同学们可能会有疑惑,这看上去和我们以前学的双向链表十分相似是吧。
2.list的底层式双向链表结构,双向链表中每个元素储存在互不相关的独立节点中,在节点中通过指针指向前一个元素和后一个元素。
3.list和forward_list非常相似:最主要的不同在于forward_list是单链表,只能超前迭代,让其更简单高效。
4.与其他的序列式的容器相比(arry,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
这个也就是双链表的优点了。
5.与其他序列式容器相比,list和forward_list最大的缺陷就是不支持任意位置的随机访问,比如要访问list的第6个元素,必须从已知的位置(一般式头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于储存类型较小元素的大list来说可能是一个重要的因素)
这也就是双链表的缺点
List的使用方式
List的定义方式
方式一:构造一个某类型的空容器
list<int> a1;//构造int类型的空容器
方式二:构造一个由n个val的值
list<int> a2(10,2);
方式三:拷贝构造其他容器的复制品
list<int> a3(a2);
方式四:使用迭代器拷贝某一段内容
string s1="hello world";
list<char> a4(s1.begin(),s1.end())
方式五:构造数组某段区间的复制品
int arr[5]={1,2,3,4,5};
list<int> a5(arr,arr+5);
省流:上面四种方式和vector的构造一模一样,只是list里面多了一点,list可以用数组初始化。
List的插入和删除
头插和头删
push_front和 pop_front
void test1()
{list<int> a1;a1.push_front(1);a1.push_front(2);a1.push_front(3);a1.push_front(4);a1.push_front(5);a1.push_front(6);for (auto x : a1){cout << x << " ";}a1.pop_front();a1.pop_front();a1.pop_front();a1.pop_front();cout << endl;for (auto x: a1){cout << x << " ";}
}

尾插和尾删
void test2()
{list<int> a1;a1.push_back(1);a1.push_back(2);a1.push_back(3);a1.push_back(4);a1.push_back(5);a1.push_back(6);for (auto x : a1){cout << x << " ";}cout << endl;a1.pop_back();a1.pop_back();a1.pop_back();for (auto x : a1){cout << x << " ";}
}

insert
有三种插入方式
方式一:在指定位置插入一个值
void test7()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.insert(a.end(),50);for (auto x : a){cout << x << " ";}
}

方式二:在指定迭代器位置插入n个val
void test7()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.insert(a.end(),5,10);for (auto x : a){cout << x << " ";}
}

方式三:在指定迭代器位置插入一段代码(左闭右开)
void test7()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.insert(a.end(),a.begin(),a.end());for (auto x : a){cout << x << " ";}
}

erase支持两种删除方式
方式一:删除指定迭代器的位置
void test7()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.erase(a.begin());for (auto x : a){cout << x << " ";}
}

方式二:删除某个迭代器区间
void test7()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.erase(a.begin(),a.end());for (auto x : a){cout << x << " ";}
}

2.迭代器的使用
begin和end
void test3()
{list<int> a1;a1.push_back(1);a1.push_back(2);a1.push_back(3);a1.push_back(4);a1.push_back(5);a1.push_back(6);list<int>::iterator it = a1.begin();while (it != a1.end()){cout << *it << " ";it++;}
}

rbegin和rend
void test4()
{list<int> a1;a1.push_back(1);a1.push_back(2);a1.push_back(3);a1.push_back(4);a1.push_back(5);a1.push_back(6);list<int>::reverse_iterator it = a1.rbegin();while (it != a1.rend()){cout << *it << " ";it++;}
}

3.list的元素获取
front和back
front函数用于获取list容器当中的第一个元素,back函数用于获取list容器中的最后一个元素。
void test5()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.push_back(6);cout << a.front() << " " << a.back() << endl;
}

4.list容量相关
size可以直接获取容量的大小
void test5()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.push_back(6);cout << a.size();
}

resize
resize两个参数,一个是你要重新赋值的大小,一个是你要重新赋值的默认值
使用规则:
1.如果被重新赋值的值小于本来的大小,那么size就缩小到此值
2.如果重新赋值的值大于本来的大小那么就将szie扩大到该值并且把我们默认值赋予它。
void test6()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.push_back(6);a.resize(4, 6);for (auto x : a){cout << x << " ";}cout << endl;a.resize(9, 6);for (auto x : a){cout << x << " ";}
}

empyt和clear
1.clear清空list
1.empty判断是否为空
void test6()
{list<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);a.push_back(6);a.resize(4, 6);cout << a.empty()<<endl;a.clear();cout << a.empty()<<endl;
}

5.list的操作函数
sort
顾名思义就是排序
void test6()
{list<int> a;a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);for (auto x : a){cout << x << " ";}a.sort();cout << endl;for (auto x : a){cout << x << " ";}}

splice
splice的使用发法有三种
方式一:将一个list拼接到另一个指定迭代器位置。
void test6()
{list<int> a;list<int> a1(5,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.splice(a.begin(), a1);for (auto x : a){cout << x << " ";}}

方式二:将容器当中的某一个数据拼接到另一个容器的指定迭代器的位置。
void test6()
{list<int> a;list<int> a1(5,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.splice(a.begin(), a1,a1.begin());for (auto x : a){cout << x << " ";}}

方式三:将容器指定指定迭代器区间的数据拼接到另一个容器的指定迭代器位置。
void test6()
{list<int> a;list<int> a1(5,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.splice(a.begin(), a1,a1.begin(),a1.end());for (auto x : a){cout << x << " ";}}

remove
参数只有一个,给定一个值删除list中所有这个值
void test6()
{list<int> a;list<int> a1(5,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.splice(a.begin(), a1,a1.begin(),a1.end());a.remove(6);for (auto x : a){cout << x << " ";}
}

remove_if
给定一个条件如果符合条件就删除
void test6()
{list<int> a;list<int> a1(5,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.splice(a.begin(),a1,a1.begin(),a1.end());for (auto x : a){cout << x << " ";}cout << endl;a.remove_if(single_digit);for (auto x : a){cout << x << " ";}}

unique
去除连续的重复值
void test6()
{list<int> a;list<int> a1(5,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.splice(a.begin(),a1,a1.begin(),a1.end());for (auto x : a){cout << x << " ";}cout << endl;a.unique();for (auto x : a){cout << x << " ";}}

注意了我们并不是去重,而是删除连续重复的值
如果我们想要去重应该怎么办呢?
就是先排序再去除连续的重复值
void test6()
{list<int> a;list<int> a1(5,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.push_back(4);a.push_back(4);a.splice(a.begin(),a1,a1.begin(),a1.end());for (auto x : a){cout << x << " ";}cout << endl;a.sort();a.unique();for (auto x : a){cout << x << " ";}
}

merge
归并并进行排序
使得两个list合并到一个当中并且使他们有序
注意!!!!
一定要提前对两个list进行排序
不然会报错!!!!
void test6()
{list<int> a;list<int> a1(3,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.push_back(4);a.push_back(4);a1.push_back(56);a1.push_back(34);a1.push_back(34);a1.push_back(28);a.sort();a1.sort();a.merge(a1);for (auto x : a){cout << x << " ";}
}

reverse
这个很简单,就是字面意思(逆序)
void test6()
{list<int> a;list<int> a1(3,6);a.push_back(5);a.push_back(6);a.push_back(3);a.push_back(8);a.push_back(2);a.push_back(4);a.push_back(4);a.push_back(4);a1.push_back(56);a1.push_back(34);a1.push_back(34);a1.push_back(28);a.sort();a1.sort();a.merge(a1);a.reverse();for (auto x : a){cout << x << " ";}
}

assign
这个函数有两个用法
方式一:重新赋予n个val值
void test7()
{list<char> a(4, 'a');a.assign(3, 'b');for (auto x : a){cout << x << " ";}
}

方式二:使用迭代器赋值
void test7()
{list<char> a(4, 'a');string s("hello");a.assign(s.begin(), s.end());for (auto x : a){cout << x << " ";}
}

swap
交换两个容器的内容
void test7()
{list<char> a(20, 'a');list<char> b(10, 'b');a.swap(b);for (auto x : a){cout << x << " ";}
}

6.总结
本文主要讲了list的一些函数的使用,大家是不是发现和前面两个的容器差不多,但是相对于它们多出一些函数,我们主要记住这些多出的函数就行,本张就到此结束,希望观众老爷们留下你的三连加关注,谢谢!
相关文章:
c++List的详细介绍
cList详细使用 write in front 作者: 不进大厂不改名 专栏: c 作者简介:大一学生 希望能向其他大佬和同学学习! 本篇博客简介:本文主要讲述了一种新容器list的使用方法,相信你在学了后,能够加深…...
Heap堆的升序排序
在heap堆中,大根堆是一种特殊的堆,它满足下列性质:对于任意一个非叶子节点i,其左右子节点的值均小于等于它本身的值。 在大根堆中,堆顶元素永远是值最大的元素,所以将堆顶元素不断取出来,就相当…...
小程序开发收费价目表
小程序作为一种新兴应用形式,正在逐渐成为企业和个人推广、运营的重要手段。然而,小程序开发的价格因项目规模和复杂程度差异较大,令不少人望而却步。本文将从小程序开发的相关因素入手,探讨小程序开发的价格范围和算法。 一、小…...
Dubbo服务暴露步骤详解
文章目录Dubbo服务暴露步骤详解背景介绍理论知识讲解什么是服务暴露?Dubbo 服务暴露的基本原理操作步骤具体实现环境准备实现服务接口实现服务提供者配置 Dubbo 服务提供者启动服务提供者实现服务消费者配置 Dubbo 服务消费者测试总结Dubbo服务暴露步骤详解 背景介…...
第十四届蓝桥杯编程题部分代码题解
C. 冶炼金属 最大值就是取 a/ba / ba/b 的最小值,最小值就是二分找到满足 mid∗(bi1)≥aimid * (b_i 1) ≥ a_imid∗(bi1)≥ai 的最小值 #include<bits/stdc.h> #define int long long #define x first #define y second using namespace std;void sol…...
统一结果封装异常处理
统一结果封装&异常处理2,统一结果封装2.1 表现层与前端数据传输协议定义2.2 表现层与前端数据传输协议实现2.2.1 环境准备2.2.2 结果封装步骤1:创建Result类步骤2:定义返回码Code类步骤3:修改Controller类的返回值步骤4:启动服务测试3,统一异常处理3…...
数字藏品平台的发展趋势是什么?
1、数字藏品平台具体内容生产模式将在PGC(专业生产制造具体内容)方式向PUGC(技术专业用户生产内容)方式变化。 目前,中国热门的数字藏品平台都在PGC模式中持续发展的,而国外流行NFT平台则比较多选用UGC&am…...
Vue3对话框(Dialog)
Vue2对话框(Dialog) 可自定义设置以下属性: 标题(title),类型:string | slot,默认 提示 内容(content),类型:string | slot…...
【深度强化学习】(5) DDPG 模型解析,附Pytorch完整代码
大家好,今天和各位分享一下深度确定性策略梯度算法 (Deterministic Policy Gradient,DDPG)。并基于 OpenAI 的 gym 环境完成一个小游戏。完整代码在我的 GitHub 中获得: https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Mod…...
unity,Color.Lerp函数
介绍 Color.Lerp函数是Unity引擎中的一个静态函数,用于在两个颜色值之间进行线性插值,从而实现颜色渐变效果 方法 Color.Lerp函数是Unity引擎中的一个静态函数,用于在两个颜色值之间进行线性插值,从而实现颜色渐变效果。该函数的…...
洛谷P8799 [蓝桥杯 2022 国 B] 齿轮 C语言/C++
[蓝桥杯 2022 国 B] 齿轮 题目描述 这天,小明在组装齿轮。 他一共有 nnn 个齿轮,第 iii 个齿轮的半径为 rir_{i}ri, 他需要把这 nnn 个齿轮按一定顺序从左到右组装起来,这样最左边的齿轮转起来之后,可以传递到最右边的齿轮&a…...
景区在线售票系统功能开发介绍
目前游客线上订票已经普及,景区开通线上购票渠道,方便游客购票,对于还没有开通线上购票的景区来说,需要提前了解一下景区线上售票系统的一些功能,下面给大家详细介绍一下景区在线售票需要哪些功能。 1、在线售票 包含门…...
webService的底层调用方式
webservice中采用协议Http,是指什么意思 WebService使用的是 SOAP (Simple Object Access Protocol)协议 Soap协议只是用来封装消息用的。封装后的消息你可以通过各种已有的协议来传输,比如http,tcp/ip,smtp,等等,你甚至还一次用自定义的协议…...
关于文件的一些小知识下
🍍个人主页🍍:🔜勇敢的小牛儿🚩 🔱推荐专栏🔱:C语言知识点 ⚠️座右铭⚠️:敢于尝试才有机会 🐒今日鸡汤🐒: 你受的苦 吃的亏 担的责 扛的罪 忍的…...
使用Cheat Engine与DnSpy破解Unity游戏
题目连接: https://play.picoctf.org/practice/challenge/361?originalEvent72&page3我们是windows系统,所以点击windows game下载游戏 双击运行pico.exe 屏幕上方的一串英文是叫我们找flag,我在这个小地图里走来走去也没flagÿ…...
溯源取证-内存取证基础篇
使用工具: volatility_2.6_lin64_standalone 镜像文件: CYBERDEF-567078-20230213-171333.raw 使用环境: kali linux 2022.02 我们只有一个RAW映像文件,如何从该映像文件中提取出我们想要的东西呢? 1.Which volatili…...
Leetcode.100 相同的树
题目链接 Leetcode.100 相同的树 easy 题目描述 给你两棵二叉树的根节点 p和 q,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3…...
每个程序员都应该知道的8大算法
在编程开发中,算法是用于解决特定问题或完成特定任务的一组指令或过程。算法可以用任何编程语言表示,可以像一系列基本操作一样简单,也可以像涉及不同数据结构和逻辑的多步骤过程一样复杂。 算法的主要目标是接收输入、处理它并提供预期的输…...
Nestjs实战超干货-概况-模块-Modules
模块 模块就是一个声明了装饰器Module()的类。装饰器Module()提供了元数据,以便让Nest组织应用程序结构。 每个应用程序至少有一个模块,即根模块。根模块是 Nest 用来构建应用程序图的起点,应用程序图是 Nest 用来解析模块和提供者关系和依赖…...
template
模板 模板注意事项 模板的函数体和声明一定要在一起,即放在同一个.h文件中,而不能将其分开到cpp和h文件中模板的编译技巧就是尽量多编译,模板很难查找错误模板的报错一般只有第一行有作用模板指定类型从左到右依次指定 模板推导 #pragma #…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
