当前位置: 首页 > news >正文

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 作者&#xff1a; 不进大厂不改名 专栏&#xff1a; c 作者简介&#xff1a;大一学生 希望能向其他大佬和同学学习&#xff01; 本篇博客简介&#xff1a;本文主要讲述了一种新容器list的使用方法&#xff0c;相信你在学了后&#xff0c;能够加深…...

Heap堆的升序排序

在heap堆中&#xff0c;大根堆是一种特殊的堆&#xff0c;它满足下列性质&#xff1a;对于任意一个非叶子节点i&#xff0c;其左右子节点的值均小于等于它本身的值。 在大根堆中&#xff0c;堆顶元素永远是值最大的元素&#xff0c;所以将堆顶元素不断取出来&#xff0c;就相当…...

小程序开发收费价目表

小程序作为一种新兴应用形式&#xff0c;正在逐渐成为企业和个人推广、运营的重要手段。然而&#xff0c;小程序开发的价格因项目规模和复杂程度差异较大&#xff0c;令不少人望而却步。本文将从小程序开发的相关因素入手&#xff0c;探讨小程序开发的价格范围和算法。 一、小…...

Dubbo服务暴露步骤详解

文章目录Dubbo服务暴露步骤详解背景介绍理论知识讲解什么是服务暴露&#xff1f;Dubbo 服务暴露的基本原理操作步骤具体实现环境准备实现服务接口实现服务提供者配置 Dubbo 服务提供者启动服务提供者实现服务消费者配置 Dubbo 服务消费者测试总结Dubbo服务暴露步骤详解 背景介…...

第十四届蓝桥杯编程题部分代码题解

C. 冶炼金属 最大值就是取 a/ba / ba/b 的最小值&#xff0c;最小值就是二分找到满足 mid∗(bi1)≥aimid * (b_i 1) ≥ a_imid∗(bi​1)≥ai​ 的最小值 #include<bits/stdc.h> #define int long long #define x first #define y second using namespace std;void sol…...

统一结果封装异常处理

统一结果封装&异常处理2&#xff0c;统一结果封装2.1 表现层与前端数据传输协议定义2.2 表现层与前端数据传输协议实现2.2.1 环境准备2.2.2 结果封装步骤1:创建Result类步骤2:定义返回码Code类步骤3:修改Controller类的返回值步骤4:启动服务测试3&#xff0c;统一异常处理3…...

数字藏品平台的发展趋势是什么?

1、数字藏品平台具体内容生产模式将在PGC&#xff08;专业生产制造具体内容&#xff09;方式向PUGC&#xff08;技术专业用户生产内容&#xff09;方式变化。 目前&#xff0c;中国热门的数字藏品平台都在PGC模式中持续发展的&#xff0c;而国外流行NFT平台则比较多选用UGC&am…...

Vue3对话框(Dialog)

Vue2对话框&#xff08;Dialog&#xff09; 可自定义设置以下属性&#xff1a; 标题&#xff08;title&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认 提示 内容&#xff08;content&#xff09;&#xff0c;类型&#xff1a;string | slot&#xf…...

【深度强化学习】(5) DDPG 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度确定性策略梯度算法 (Deterministic Policy Gradient&#xff0c;DDPG)。并基于 OpenAI 的 gym 环境完成一个小游戏。完整代码在我的 GitHub 中获得&#xff1a; https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Mod…...

unity,Color.Lerp函数

介绍 Color.Lerp函数是Unity引擎中的一个静态函数&#xff0c;用于在两个颜色值之间进行线性插值&#xff0c;从而实现颜色渐变效果 方法 Color.Lerp函数是Unity引擎中的一个静态函数&#xff0c;用于在两个颜色值之间进行线性插值&#xff0c;从而实现颜色渐变效果。该函数的…...

洛谷P8799 [蓝桥杯 2022 国 B] 齿轮 C语言/C++

[蓝桥杯 2022 国 B] 齿轮 题目描述 这天&#xff0c;小明在组装齿轮。 他一共有 nnn 个齿轮&#xff0c;第 iii 个齿轮的半径为 rir_{i}ri​, 他需要把这 nnn 个齿轮按一定顺序从左到右组装起来&#xff0c;这样最左边的齿轮转起来之后&#xff0c;可以传递到最右边的齿轮&a…...

景区在线售票系统功能开发介绍

目前游客线上订票已经普及&#xff0c;景区开通线上购票渠道&#xff0c;方便游客购票&#xff0c;对于还没有开通线上购票的景区来说&#xff0c;需要提前了解一下景区线上售票系统的一些功能&#xff0c;下面给大家详细介绍一下景区在线售票需要哪些功能。 1、在线售票 包含门…...

webService的底层调用方式

webservice中采用协议Http&#xff0c;是指什么意思 WebService使用的是 SOAP (Simple Object Access Protocol)协议 Soap协议只是用来封装消息用的。封装后的消息你可以通过各种已有的协议来传输&#xff0c;比如http,tcp/ip,smtp,等等&#xff0c;你甚至还一次用自定义的协议…...

关于文件的一些小知识下

&#x1f34d;个人主页&#x1f34d;:&#x1f51c;勇敢的小牛儿&#x1f6a9; &#x1f531;推荐专栏&#x1f531;&#xff1a;C语言知识点 ⚠️座右铭⚠️&#xff1a;敢于尝试才有机会 &#x1f412;今日鸡汤&#x1f412;&#xff1a; 你受的苦 吃的亏 担的责 扛的罪 忍的…...

使用Cheat Engine与DnSpy破解Unity游戏

题目连接&#xff1a; https://play.picoctf.org/practice/challenge/361?originalEvent72&page3我们是windows系统&#xff0c;所以点击windows game下载游戏 双击运行pico.exe 屏幕上方的一串英文是叫我们找flag&#xff0c;我在这个小地图里走来走去也没flag&#xff…...

溯源取证-内存取证基础篇

使用工具&#xff1a; volatility_2.6_lin64_standalone 镜像文件&#xff1a; CYBERDEF-567078-20230213-171333.raw 使用环境&#xff1a; kali linux 2022.02 我们只有一个RAW映像文件&#xff0c;如何从该映像文件中提取出我们想要的东西呢&#xff1f; 1.Which volatili…...

Leetcode.100 相同的树

题目链接 Leetcode.100 相同的树 easy 题目描述 给你两棵二叉树的根节点 p和 q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3…...

每个程序员都应该知道的8大算法

在编程开发中&#xff0c;算法是用于解决特定问题或完成特定任务的一组指令或过程。算法可以用任何编程语言表示&#xff0c;可以像一系列基本操作一样简单&#xff0c;也可以像涉及不同数据结构和逻辑的多步骤过程一样复杂。 算法的主要目标是接收输入、处理它并提供预期的输…...

Nestjs实战超干货-概况-模块-Modules

模块 模块就是一个声明了装饰器Module()的类。装饰器Module()提供了元数据&#xff0c;以便让Nest组织应用程序结构。 每个应用程序至少有一个模块&#xff0c;即根模块。根模块是 Nest 用来构建应用程序图的起点&#xff0c;应用程序图是 Nest 用来解析模块和提供者关系和依赖…...

template

模板 模板注意事项 模板的函数体和声明一定要在一起&#xff0c;即放在同一个.h文件中&#xff0c;而不能将其分开到cpp和h文件中模板的编译技巧就是尽量多编译&#xff0c;模板很难查找错误模板的报错一般只有第一行有作用模板指定类型从左到右依次指定 模板推导 #pragma #…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...