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

目录

1.什么是list?

2.list的构造 

3.list迭代器的使用(list iterator) 

4.list capacity

5.list modifiers

6.list的其他操作


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来说这可能是一个重要的影响因素)

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;
}

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;
}

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;
}

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;
}

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.mzph.cn/bicheng/53524.shtml

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

相关文章

SLM561A​​系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …

【软件文档】软件系统需求管理规程(项目管理word原件)

软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c;技术解…

解决Pynput不能在Ubuntu22.04上正常使用问题

pynput 是一个 Python 库&#xff0c;它提供了一套简单的接口来控制和监控输入设备&#xff0c;包括鼠标和键盘。这个库允许开发者编写跨平台的代码来处理输入事件&#xff0c;无需担心底层操作系统的差异。 下面是pynput的测试程序&#xff1a; from pynput.keyboard import …

中秋之美——html5+css+js制作中秋网页

中秋之美——html5cssjs制作中秋网页 一、前言二、功能展示三、系统实现四、其它五、源码下载 一、前言 八月十五&#xff0c;秋已过半&#xff0c;是为中秋。 “但愿人长久&#xff0c;千里共婵娟”&#xff0c;中秋时节&#xff0c;气温已凉未寒&#xff0c;天高气爽&#x…

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置&#xff1a; // launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.…

分布式项目中使用雪花算法提前获取对象主键ID

hello&#xff0c;大家好&#xff0c;我是灰小猿&#xff01; 在做分布式项目开发进行数据表结构设计时&#xff0c;有时候为了提高查询性能&#xff0c;在进行数据库表设计时&#xff0c;会使用自增ID来代替UUID作为数据的主键ID&#xff0c;但是这样就会有一个问题&#xff…

改写二进制文件

以下是一些常见的方法和工具&#xff1a; 1. 使用十六进制编辑器 十六进制编辑器 是最直接的工具之一&#xff0c;用于查看和编辑二进制文件中的数据。它允许你以十六进制格式查看和修改文件内容。 常见十六进制编辑器&#xff1a; HxD&#xff08;Windows&#xff09;Hex F…

JavaScript 根据关键字匹配数组项

要在JavaScript数组中根据关键字匹配项&#xff0c;可以使用filter方法结合一个测试函数。以下是一个示例代码&#xff0c;定义了一个函数findByKeyword&#xff0c;该函数接受一个数组和一个关键字&#xff0c;然后返回一个新数组&#xff0c;其中包含与关键字匹配的所有项。 …

【LabVIEW学习篇 - 16】:文件操作

文章目录 CSV文件CSV写入CSV读取 TXT文件txt写入txt读取 INI文件INI文件写入INI文件读取 CSV文件 .csv (Comma-Separated Values&#xff09;是逗号分隔值文件格式&#xff0c;有时也称之为字符分隔值&#xff0c;因为分隔符也可以不是逗号(最常见的是逗号和制表符)&#xff0…

(一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别

🍂1、不说废话,现象展示 🍃图片识别 🍃视频识别 自己训练样本 十分简易快速 opencv级联ha

springboot启动时替换配置参数

SpringBoot启动时配置参数替换 一.背景 SpringBoot项目启动的时候&#xff0c;在不使用配置中心等的前提下或者有公司强制使用指定的“密码箱”情况下&#xff0c;需要远程获取关键配置信息&#xff0c;比如数据库密码&#xff0c;则需要在项目启动前获取配置并且进行本地配置…

小皮面板webman ai项目本地启动教程

1.前置条件 下载小皮面板 下载后&#xff0c;双击安装&#xff0c;一路next&#xff08;下一步&#xff09;&#xff0c;无需更改配置。 2.安装必须软件 在小皮面板的软件管理页&#xff0c;安装编号①②③④下面四个软件。 3.启动本地服务 进入到小皮面板的首页&#x…

Java Stream API

Java Stream API 在现代软件开发中&#xff0c;处理集合&#xff08;如列表、集合等&#xff09;中的数据是一项常见且至关重要的任务。Java 自 JDK 8 引入的 Stream API 极大地简化了这一过程&#xff0c;使得数据处理变得更加直观、灵活且易于理解。本文将带你深入了解 Java…

mysql学习教程,从入门到精通,MySQL 删除数据表与选择数据库(7)

1、MySQL 删除数据表 MySQL中删除数据表是非常容易操作的&#xff0c;但是你在进行删除表操作时要非常小心&#xff0c;因为执行删除命令后所有数据都会消失。 语法 以下为删除MySQL数据表的通用语法&#xff1a;MySQL 删除数据表 MySQL中删除数据表是非常容易操作的&#xff…

空指针异常 (NullPointerException)怎么办

在 Java 编程中&#xff0c;空指针异常&#xff08;NullPointerException&#xff0c;简称 NPE&#xff09;是最常见且困扰开发人员的异常之一。尽管 Java 是一种强类型语言&#xff0c;设计上提供了类型安全的特性&#xff0c;但空指针问题依然是开发过程中最常见的运行时异常…

把Django字典格式的数据库配置转成tortoise-orm的URL格式

Django版的数据库配置如下&#xff1a; DATABASES {"default": {"ENGINE": "django.db.backends.mysql","NAME": "test_1","USER": "root","PASSWORD": "123456","HOST&quo…

MES系统如何支持企业进行数字化转型

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;在企业数字化转型中扮演着至关重要的角色&#xff0c;它通过提供实时的生产数据、优化生产流程、提升质量管理水平、实现设备智能化管理以及促进企业内部协同和沟通等多种方式&#xff…

多线程下载网络资源

示例&#xff1a;模拟通过5个线程下载10个网络图片 import java.io.*; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayL…

Hive和Hbase的区别

Hive 和 HBase 都是 Hadoop 生态系统中的重要组件&#xff0c;它们都能处理大规模数据&#xff0c;但各自有不同的适用场景和设计理念。以下是两者的主要区别&#xff1a; 1. 数据模型 Hive&#xff1a;Hive 类似于传统的关系型数据库 (RDBMS)&#xff0c;以表格形式存储数据…

Linux_kernel移植linux09

一、温故知新 1、分析uboot源码目录 每个目录基本上都会有自己的Makefile进行当前层级目录的编译&#xff0c;最后在整个uboot源码目录中会有一个Makefile文件进行整合&#xff0c;将每一层级编译出的目标文件&#xff0c;整合到一起&#xff0c;链接到一起&#xff0c;最终生成…