C++入门9——list的使用

news/2024/9/16 12:28:02/ 标签: c++, 开发语言, list, stl

目录

list%EF%BC%9F-toc" style="margin-left:0px;">1.什么是list

list%E7%9A%84%E6%9E%84%E9%80%A0%C2%A0-toc" style="margin-left:0px;">2.list的构造 

list%E8%BF%AD%E4%BB%A3%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%88list%20iterator%EF%BC%89%C2%A0-toc" style="margin-left:0px;">3.list迭代器的使用(list iterator) 

list%20capacity-toc" style="margin-left:0px;">4.list capacity

list%20modifiers-toc" style="margin-left:0px;">5.list modifiers

list%E7%9A%84%E5%85%B6%E4%BB%96%E6%93%8D%E4%BD%9C-toc" style="margin-left:0px;">6.list的其他操作


list%EF%BC%9F">1.什么是list

在官网中,对list有这样的介绍:

Lists are sequence containers that allow constant time insert and erase operations anywhere within the sequence, and iteration in both directions.

即:list是允许在序列中的任何位置进行恒定时间的插入和删除操作的序列容器,并且可以双向迭代。 

于是对list便有这样的介绍:

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。

3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,以让其更简单高效。

4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的影响因素)

list%E7%9A%84%E6%9E%84%E9%80%A0%C2%A0">2.list的构造 

list的常见构造有:

list()——构造空的list

list (size_type n, const value_type& val = value_type())——构造一个有n个值为val的元素的list

list (const list& x)——拷贝构造函数;

list (InputIterator first, InputIterator last)——用[first, last)区间中的元素构造list

#include <iostream>#include<list>using namespace std;int main()
{list<int> l1;//①构造空的listlist<int> l2(4, 200);//②构造一个有n个值为val的元素的listlist<int> l3(l2);//③l2拷贝构造l3list<int> l4(l2.begin(), l2.end());//用l2的[begin(),end())构造l4//范围for遍历l1、l2、l3、l4for (auto e : l1){cout << e << " ";}cout << endl;for (auto e : l2){cout << e << " ";}cout << endl;for (auto e : l3){cout << e << " ";}cout << endl;for (auto e : l4){cout << e << " ";}cout << endl;return 0;
}

list%E8%BF%AD%E4%BB%A3%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%88list%20iterator%EF%BC%89%C2%A0">3.list迭代器的使用(list iterator) 

在之前的文章中我们就说过,可以将迭代器看做一个指针(当然底层并不完全是指针),在这里,我们理解为该指针指向list中的某个节点。

①begin+end——返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器;

②rbegin+rend——返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的 reverse_iterator,即begin位置。

#include <iostream>#include<list>using namespace std;int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);//注意list只能用范围for和迭代器访问//使用正向迭代器访问l中的元素list<int>::iterator it = l.begin();{while (it != l.end()){cout << *it << " ";++it;}cout << endl;}//使用反向迭代器访问l中的元素list<int>::reverse_iterator rit = l.rbegin();{while (rit != l.rend()){cout << *rit << " ";++rit;}cout << endl;}return 0;
}

list%20capacity">4.list capacity

①empty——检测list是否为空,是返回true,否则返回false;

②size——返回list中有效节点的个数。

#include <iostream>#include<list>using namespace std;int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);if (!l.empty()){cout << l.size() << endl;}return 0;
}

list%20modifiers">5.list modifiers

①push_front——在list首元素前插入值为val的元素;

②pop_front——删除list中第一个元素;

③push_back——在list尾部插入值为val的元素;

④pop_back——删除list中最后一个元素;

⑤insert——在list position 位置中插入值为val的元素;

⑥erase——删除list position位置的元素;

⑦swap——交换两个list中的元素;

⑧clear——清空list中的有效元素。

#include <iostream>#include<list>using namespace std;int main()
{list<int> l(4, 200);l.push_front(100);//在list首元素前插入值为val的元素;for (auto e : l){cout << e << " ";}cout << endl;l.pop_front();//删除list中第一个元素;for (auto e : l){cout << e << " ";}cout << endl;l.push_back(300);//在list尾部插入值为val的元素;for (auto e : l){cout << e << " ";}cout << endl;l.pop_back();//删除list中最后一个元素;for (auto e : l){cout << e << " ";}cout << endl;l.insert(++l.begin(), 150);//在begin()+1位置插入150for (auto e : l){cout << e << " ";}cout << endl;l.erase(++l.begin());//删除begin()+1位置的数据for (auto e : l){cout << e << " ";}cout << endl;list<int> ll(3, 100);cout << "交换前l=";for (auto e : l){cout << e << " ";}cout << "ll=";for (auto e : ll){cout << e << " ";}cout << endl;l.swap(ll);//交换l与ll的元素cout << "交换后l=";for (auto e : l){cout << e << " ";}cout << "ll=";for (auto e : ll){cout << e << " ";}cout << endl;l.clear();for (auto e : l){cout << e << " ";}cout << endl;return 0;
}

list%E7%9A%84%E5%85%B6%E4%BB%96%E6%93%8D%E4%BD%9C">6.list的其他操作

 ①reverse——对list逆置;

②sort——对list排序;

③merge——将两个有序list归并为一个有序的list(无序时可调用sort先排序);

④unique——去重(去重要求所有相同的值要相邻,所以在使用unique之前最好也先调用sort);

⑤remove——相当于find+erase;

#include <iostream>
#include <list>using namespace std;int main()
{list<int> l1;l1.push_back(4);l1.push_back(2);l1.push_back(3);l1.push_back(1);cout << "排序前:";for (auto e : l1){cout << e << " ";}cout << endl;l1.sort();//排序cout << "排序后:";for (auto e : l1){cout << e << " ";}cout << endl;l1.reverse();cout << "逆置后:";//逆置for (auto e : l1){cout << e << " ";}cout << endl;list<int> l2,l3;l2.push_back(4);l2.push_back(2);l2.push_back(3);l2.push_back(1);l3.push_back(4);l3.push_back(4);l3.push_back(5);l3.push_back(7);l2.sort();l3.sort();l2.merge(l3);//归并for (auto e : l2){cout << e << " ";}cout << endl;l2.unique();//去重for (auto e : l2){cout << e << " ";}cout << endl;return 0;
}


http://www.ppmy.cn/news/1522919.html

相关文章

《数字信号处理》学习05-单位冲击响应与系统响应

目录 一&#xff0c;单位冲激响应 二&#xff0c;LTI系统对任意序列的系统响应 三&#xff0c;LTI系统的性质 通过上一篇文章《数字信号处理》学习04-离散时间系统中的线性时不变系统-CSDN博客的学习&#xff0c;我已经知道了离散时间线性时不变系统&#xff08;LTI&#x…

输送线相机拍照信号触发(博途PLC高速计数器中断立即输出应用)

博途PLC相关中断应用请参考下面文章链接: T法测速功能块 T法测速功能块(博途PLC上升沿中断应用)-CSDN博客文章浏览阅读165次。本文介绍了博途PLC中T法测速的原理和应用,包括如何开启上升沿中断、配置中断以及T法测速功能块的使用。重点讲述了在中断事件发生后执行的功能块处…

git submodule子模块的使用

子模块的使用 添加子模块 添加子模块 git submodule add <子仓库URL> <子仓库路径> 例子&#xff1a; git submodule add http://192.168.100.181/guideir/poco.git 3rdparty/poco 若子模块存在好几个分支&#xff0c;可以在添加子模块时&#xff0c;指定分支 g…

fastadmin 文件上传腾讯云

1-安装腾讯云SDK composer require qcloud/cos-sdk-v5 2-腾讯云配置 <?phpnamespace app\common\controller;use Qcloud\Cos\Client; use think\Controller; use think\Db;class Tencent extends Controller {/*** 上传文件* param $config* param $key* return array*/p…

点云处理实操(四) -PCL中的点云三角化

目录 一、什么是点云三角化 二、常见的三角化算法 1. 贪婪投影三角化(Greedy Projection Triangulation) 2. 泊松表面重建(Poisson Surface Reconstruction) 3. Delaunay三角化(Delaunay Triangulation) 4. 球面法三角化(Ball Pivoting Algorithm, BPA) 5. Alpha…

vue ts as断言处理

在Vue中&#xff0c;使用TypeScript时&#xff0c;你可能会遇到需要初始化数组并为其指定类型的情况。在这种情况下&#xff0c;你可以使用TypeScript的as关键字来断言数组的类型。 例如&#xff0c;如果你有一个Item类型&#xff0c;你可以这样初始化一个空数组并将其类型断言…

Matlab simulink建模与仿真 第十一章(端口及子系统库)【上】

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、端口及子系统库中的模块概览 注&#xff1a;In模块、Out模块和Subsystem模块在第二章中均有介绍&#xff0c;本章不再赘述&#xff1b;Subsystem Examples子系统实例模块也不进行介绍。 二、使能及其子模…

原型模式prototype

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/prototype 能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类 所有的原型类都必须有一个通用的接口&#xff0c; 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对…

【爬虫软件】小红薯评论区采集工具

一、采集目标与应用场景 您好&#xff01;我利用Python技术自主研发了一款高效的爬虫软件&#xff0c;批量收集小红薯平台上的评论&#xff0c;包括主评论及其下的二级评论。 为了拓宽用户群体&#xff0c;让不具备编程基础的小白用户也能轻松上手&#xff0c;我开发成了界面…

【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

目录 ✨播放一个视频的流程✨为什么要编码&#xff08;压缩&#xff09;视频数据&#xff1f;✨如何编码&#xff08;压缩&#xff09;数据&#x1f384;简单的例子&#x1f384;音视频编码方式&#x1f384;视频编码格式H264编码是什么&#xff1f;发展历程&#xff1f;H.264基…

UnLua环境搭建

一、环境搭建 1、下载UnLua工程&#xff1a;https://github.com/Tencent/UnLua 2、复制Plugins/UnLua目录下的插件到自己的项目中 3、重新生成自己的VS工程 4、打开VS工程的项目名.Build.cs文件&#xff0c;引用UnLua插件,重新编译工程 PublicDependencyModuleNames.AddRan…

数组与贪心算法——605、121、122、561、455、575(5简1中)

605. 种花问题&#xff08;简单&#xff09; 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xf…

【2024高教社杯全国大学生数学建模竞赛】B题模型建立求解

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明&#xff08;等四问全部更新完再写&#xff09;5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成&#xff…

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中…

【网络安全】Exif 数据储存型XSS

未经许可,不得转载。 文章目录 Exif步骤Exif EXIF(Exchangeable Image File Format)数据是一种存储在图像文件中的元数据格式,常用于数码照片和扫描图像。它包含了与图像相关的各种信息,比如拍摄日期和时间、相机品牌和型号、拍摄时的设置(如曝光时间、光圈、ISO等)、地…

Java Kafka生产者实现

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

Android 9.0 SystemUI状态栏/快捷设置介绍

Android 9.0 SystemUI状态栏/快捷设置介绍 状态栏 状态栏是SystemUI里的重要功能之一&#xff0c;状态栏的一大功能就是显示功能图标&#xff0c;以告知用户一些最基本的信息状态&#xff0c;在 Android 9.0 版本中&#xff0c;状态栏一般包含运营商信息、时间、日期、电池、通…

python简单计算入门教程|加减法

python通过调用numpy模块&#xff0c;非常擅长数学计算。再通过调用matplotlib模块&#xff0c;可以自由自在地输出numpy计算的结果。 今天&#xff0c;我们就尝试一些基本计算。 下述是正弦函数和余弦函数的加法和减法计算结果。 图1 代码为&#xff1a; import matplotli…

UE4_后期处理_后期处理材质及后期处理体积三—遮挡物体描边显示

一、效果&#xff1a; 在很多游戏中为了玩家能看到墙面背后是否有敌人&#xff0c;会给被遮挡的敌人增加描边显示&#xff0c;效果如下&#xff1a; 参考&#xff1a; https://zhuanlan.zhihu.com/p/81310476 https://zhuanlan.zhihu.com/p/358140547 二、所需知识 知识点…

3.C_数据结构_栈

概述 什么是栈&#xff1a; 栈又称堆栈&#xff0c;是限定在一段进行插入和删除操作的线性表。具有后进先出(LIFO)的特点。 相关名词&#xff1a; 栈顶&#xff1a;允许操作的一端栈底&#xff1a;不允许操作的一端空栈&#xff1a;没有元素的栈 栈的作用&#xff1a; 可…