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

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

相关文章

虚拟机的安装-详细教程

目录 新建虚拟机 选择典型 安装操作系统 选择CentOS7 64位版本 虚拟机存放位置 磁盘容量 完成 编辑虚拟机 修改内存大小 设置处理器个数 选择镜像 开启虚拟机 进入界面&#xff0c;回车 选择语言 安装类型 磁盘分区 开启网络 设置密码和用户 重启 接受许可…

基于Java语言的光伏运维管理系统

背景 ‌光伏发电系统主要由‌‌太阳电池板&#xff08;组件&#xff09;、‌控制器和‌逆变器‌三大部分组成&#xff0c;主要部件由电子元器件构成。此外&#xff0c;光伏发电系统还包括‌变压器、‌光伏方阵以及相关辅助设施等。‌ 光伏发电系统是利用光伏电池的光生伏特效应…

集成电路学习:什么是PCB印刷电路板

一、PCB&#xff1a;印刷电路板 PCB&#xff0c;全称为Printed Circuit Board&#xff0c;即印刷电路板&#xff0c;是现代电子设备中不可或缺的基础构件。它作为电子元器件的载体和连接体&#xff0c;在电子设备中发挥着至关重要的作用。以下是对PCB的详细解析&#xff1a; 二…

Linux操作系统 :文件管理(实验报告)

一、实验目的 熟练掌握Shell特性和文件管理命令的使用方法 二、实验环境 硬件&#xff1a;PC电脑一台&#xff0c;网络正常&#xff1b; 配置&#xff1a;win10系统&#xff0c;内存大于8G 硬盘500G及以上 软件&#xff1a;VMware、Ubuntu16.04、 三、实验内容 Linux的文件…

[000-01-008].Seata案例应用

业务说明&#xff1a;这里我们创建三个服务&#xff0c;一个订单服务&#xff0c;一个库存服务&#xff0c;一个账户服务。当用户下单时&#xff0c;会在订单服务中创建一个订单&#xff0c;然后通过远程调用库存服务来扣减下单商品的库存&#xff1b;再通过远程调用账户服务来…

《‌黑神话:‌悟空》‌游戏攻略‌

时光荏苒&#xff0c;岁月如梭&#xff0c;不知不觉已经来到了2024年的9月份了。 ‌突然想写一篇关于《‌黑神话&#xff1a;‌悟空》‌的游戏攻略‌。 在《‌黑神话&#xff1a;‌悟空》‌这款以中国古代名著《‌西游记》‌为背景的动作角色扮演游戏中&#xff0c;‌玩家将扮…

Ubuntu环境的MySql下载安装

下载压缩包 此文章下载的mysql版本位5.7.29 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar解压缩 sudo tar -xvf mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar命令解释 -x&#xff1a;…

【专题】2024全球电商消费电子市场研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37552 在如今数字经济蓬勃发展的大环境下&#xff0c;电商行业正以前所未有的迅猛之势&#xff0c;对全球商业版图进行着深刻的重塑。据 Stocklytics 发布的有关全球电商市场价值及未来增长趋势的专项调查报告显示&#xff0c;2024…

Tauri应用开发实践指南(5)—Tauri 集成本地数据库

本文首发于微信公众号&#xff1a;前端徐徐。欢迎关注&#xff0c;获取更多前端技能分享。 前言 Tauri 是一个构建跨平台桌面应用程序的框架&#xff0c;利用 Web 技术构建前端&#xff0c;并使用 Rust 构建后端。它以其小巧的体积和高性能受到开发者的欢迎。在开发过程中&am…

【装包测试】Android应用权限授权小技巧

一、前言 大家在日常测试中&#xff0c;每次新安装应用或游戏都有一些前置的权限设置需要点击&#xff0c;但在不同的Android设备上的同意按钮都不完全相同&#xff0c;如果需要提高脚本的通用性以及复用性我们应该怎么办呢&#xff1f;那我们本周就一起来探讨一下这个问题吧~…

理解调试和组织 CSS——WEB开发系列26

CSS&#xff08;层叠样式表&#xff09;不仅是为网页提供样式的关键工具&#xff0c;也是调试和优化网页表现的重要部分。无论是调整网页布局&#xff0c;还是确保样式的一致性&#xff0c;掌握调试和组织 CSS 的技巧都是至关重要的。 一、使用浏览器开发者工具 浏览器开发者工…

mcu loader升级固件原理与实现

1 mcu loader升级固件原理 mcu 固件有两部分&#xff0c;如下图所示&#xff0c;一部分是 loader.bin&#xff0c;一部分是 app.bin&#xff0c;将两部分的固件合并在一起烧录进 mcu 的 flash 当中。mcu 上电进入loader 模式执行 loader.bin 部分的程序&#xff0c;然后读取 fl…

消费零售行业如何实现数智化转型?从四个阶段循序渐进

随着信息技术的迅猛进步&#xff0c;企业纷纷踏上数字化转型的征途&#xff0c;而数字化仅是实现数智化的起点。数智化&#xff0c;核心在于数据智能化&#xff0c;它强调企业运用数字化技术汇聚并分析数据&#xff0c;以数据为引擎推动决策优化与创新发展。在消费零售领域&…

变压器结构

变压器结构提供磁路&#xff0c;通常称为“变压器铁芯”&#xff0c;旨在为磁场提供流动路径。该磁路对于两个输入和输出绕组之间感应电压必不可少。 然而&#xff0c;这种变压器结构&#xff08;两个绕组缠绕在不同的支路上&#xff09;效率不高&#xff0c;因为初级绕组和次…

托勒密世界地图:现代地形图绘制的标杆诞生于公元2世纪

关注我们 - 数字罗塞塔计划 - 今天要为大家分享一幅公元150年左右的世界地图——托勒密世界地图&#xff0c;它是由古埃及的数学家、天文学家、地理学家及占星家劳狄乌斯托勒密绘制的。托勒密著有《天文学大成》、《地理学》和《占星四书》等著作&#xff0c;其中《地理学》一书…

02 Flask-快速上手

创建项目文件 从电脑选择一个盘符(来存放之后学习的项目文件) 这里选择以电脑C盘的桌面来做演示 在选择的盘符里面创建一个文件夹(来保存之后的学习文件) 使用 poetry 创建一个初始配置项(pyproject.toml) 详情参考 poetry init创建虚拟环境 poetry env use python激活虚拟…

JavaScript 实现虚拟滚动技术

虚拟滚动 虚拟滚动&#xff08;有时称为 虚拟列表、虚拟滚动条&#xff09;是 JavaScript 中的一种技术&#xff0c;旨在优化大数据量的列表渲染&#xff0c;尤其是当有成千上万的数据项时&#xff0c;直接渲染整个列表会导致性能问题。虚拟列表通过只渲染用户视口中可见的那一…

【SQL】删除表中重复数据的方法

很久之前我写入一张sql的数据表&#xff0c;它里面有很多重复的内容。然后我想只保留一条原始数据&#xff1a; 例如上面的时间&#xff0c;出现了很多重复值。 我最初用的是这种方法&#xff1a; SELECT * FROM table_name WHERE primary_key IN (SELECT max(primary_key)F…

C++设计模式——Chain of Responsibility职责链模式

一&#xff0c;职责链模式的定义 职责链模式&#xff0c;又被称为责任链模式&#xff0c;是一种行为型设计模式&#xff0c;它让多个对象依次处理收到的请求&#xff0c;直到处理完成为止。 职责链模式需要使用多个对象&#xff0c;其中的每个对象要么处理请求&#xff0c;要…

数据结构——归并排序

目录 引言 归并排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 5.算法优化 (1)区间优化 (2)判断区间是否有序 6.非递归实现 7.应用场景 结束语 引言 在学习完 数据结构——快速排序 后&#xff0c;我们接着学习一种高效的排序方法——归并排序 求点赞收藏关…