【c++】list详细讲解

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟悉list库

> 毒鸡汤:你的脸上云淡风轻,谁也不知道你的牙咬得有多紧。

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言

今天咱们学习list,咱们还是依照官网来学习:list::list - C++ Reference (cplusplus.com)

⭐主体

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
  3. list与forward_list非常相似:主要不同在于forward_list是单链表,只能单方向迭代。
  4. 与其他的序列式容器相比(array,vector,deque),list在任意位置进行插入、移除元素的执行效率更好。
  5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置。
  6. list还需要一些额外的空间,以保存每个节点的相关联信息。

咱们按照下面的图来学习list:

🌙list构造

这里就和vector的接口相似,我们这里简单举例就行:

#include<list>
#include<string>
#include<iostream>
using namespace std;int main()
{// 构造int类型的空容器list<int> lt1;	// 构造含有3个2的int类型容器list<int> lt2(3, 2);  for (auto e : lt2){cout << e << " ";}cout << endl;// 拷贝构造lt2list<int> lt3(lt2); for (auto e : lt3){cout << e << " ";}cout << endl;string s("hello");// 利用迭代器构造list<char> lt4(s.begin(), s.end());  return 0;
}

运行结果:

🌙list 插入和删除数据

函数声明接口说明
push_front在list首元素前面插入元素
pop_front删除list首元素
push_back在list尾部插入元素
pop_back在list尾部删除元素
insert在list指定的pos位置插入元素
erase在list指定的pos位置删除元素

💫push_front和pop_front

举例:

int main()
{list<int> lt;// 头插数据lt.push_front(1);lt.push_front(2);lt.push_front(3);lt.push_front(4);lt.push_front(5);for (auto e : lt){cout << e << " ";}cout << endl;// 头删数据lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

💫push_back和pop_back

举例:

int main()
{list<int> lt;// 尾插数据lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;// 尾删数据lt.pop_back();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

💫insert

使用说明:

  1. 在指定位置插入数据。
  2. 在指定位置插入n个值为val的数。
  3. 在指定位置插入一段迭代器区间(左闭右开)。

举例:

int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator pos = find(lt.begin(), lt.end(), 2);//在2的位置插入0lt.insert(pos, 0); for (auto e : lt){cout << e << " ";}cout << endl;pos = find(lt.begin(), lt.end(), 3);//在3的位置插入3个6lt.insert(pos, 3, 6); for (auto e : lt){cout << e << " ";}cout << endl;vector<int> v{ 7, 7 };pos = find(lt.begin(), lt.end(), 1);//在1的位置插入2个7lt.insert(pos, v.begin(), v.end()); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

💫erase

使用说明:

  1. 删除指定位置数据
  2. 删除指定迭代器区间中的数据。

举例:

int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator pos = find(lt.begin(), lt.end(), 2);// 删除2lt.erase(pos); for (auto e : lt){cout << e << " ";}cout << endl;pos = find(lt.begin(), lt.end(), 3);//删除3及其之后的元素lt.erase(pos, lt.end()); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

🌙list 迭代器的使用

函数声明接口说明
begin+end返回第一个元素的迭代器 + 返回最后一个元素位置的迭代器
rbegin+rend返回最后一个元素位置的迭代器 + 返回第一个元素的迭代器

说明:begin+end是正向迭代器,rbegin+rend是反向迭代器。

举例:

int main()
{string s("hello c++");list<char> lt(s.begin(), s.end());// 正向迭代器遍历容器list<char>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;// 反向迭代器遍历容器list<char>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}

运行结果:

🌙list 获取数据

函数声明接口说明
front返回list的第一个节点值的引用
back

返回list的最后一个解节点值的引用

举例:

int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);cout << lt.front() << endl;cout << lt.back() << endl;return 0;
}

运行结果:

🌙list 容量大小

函数声明接口说明
empty检测list是否为空,是返回true,反之返回false
size返回list中元素的个数

举例:

int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);cout << lt.size() << endl;cout << lt.empty() << endl;
}

运行结果:

🌙list 相关操作函数

💫erase

使用说明:swap用于交换两个容器的内容。

举个栗子:

int main()
{list<int> lt1(3, 2);list<int> lt2(2, 3);lt1.swap(lt2); //交换两个容器的内容return 0;
}

运行结果:

💫clear

使用说明:clear用于清空容器,清空后容器的size为0。

举个栗子:

int main()
{list<int> lt(5, 6);lt.clear();return 0;
}

运行结果:

💫sort

使用说明:sort可以将容器当中的数据排序(升序)。

举个栗子:

int main()
{list<int> lt;lt.push_back(2);lt.push_back(1);lt.push_back(4);lt.push_back(3);lt.push_back(5);cout << "排序前:";for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();cout << "排序后:";for (auto e : lt){cout << e << " ";}cout << endl;
}

运行结果:

💫resize

使用说明:

  1. 当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。
  2. 当所给值小于当前的size时,将size缩小到该值。

举个栗子:
 

int main()
{list<int> lt(3, 0);for (auto e : lt){cout << e << " ";}cout << endl;//将size扩大为5,扩大的值为4lt.resize(5, 1);for (auto e : lt){cout << e << " ";}cout << endl;//将size缩小为2lt.resize(2); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

💫remove

使用说明:remove可以移除指定元素。

举个栗子:

int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;// 删除容器当中值为2的元素lt.remove(2); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

💫unique

使用说明:去除连续重复的元素(如果要去除所有重复的元素需要先排序)

举个栗子:

int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(3);lt.push_back(2);lt.push_back(3);lt.push_back(2);for (auto e : lt){cout << e << " ";}cout << endl;// 去除连续重复的元素lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

💫reverse

使用说明:可以将容器当中元素的进行逆置。

举个栗子:

int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;// 逆置lt.reverse();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

运行结果:

🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/258551.html

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

相关文章

Html的<figure><figcaption>标签

Html的<figure><figcaption>标签 示例一: <figure><figcaption>figcaption001, fig标题1 </figcaption><figcaption>figcaption002, fig标题2 </figcaption><div style"width:calc(100px*2); height:calc(100px*2); back…

RM电控工程讲义

HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) 是一个回调函数&#xff0c;通常在STM32的HAL库中用于处理CAN&#xff08;Controller Area Network&#xff09;接收FIFO 0中的消息。当CAN接口在FIFO 0中有待处理的消息时&#xff0c;这个函数会被调用。 HAL库C…

[职场] 会计学专业学什么 #其他#知识分享#职场发展

会计学专业学什么 会计学专业属于工商管理学科下的一个二级学科&#xff0c;本专业培养具备财务、管理、经济、法律等方面的知识和能力&#xff0c;具有分析和解决财务、金融问题的基本能力&#xff0c;能在企、事业单位及政府部门从事会计实务以及教学、科研方面工作的工商管…

【北邮鲁鹏老师计算机视觉课程笔记】04 fitting 拟合

【北邮鲁鹏老师计算机视觉课程笔记】04 fitting 拟合 1 拟合的任务 如何从边缘找出真正的线&#xff1f; 存在问题 ①噪声 ②外点、离群点 ③缺失数据 2 最小二乘 存在的问题 3 全最小二乘 度量的是点到直线的距离而不是点在y方向到直线的距离 提示&#xff1a;点到直线的…

Java学习第十六节之创建对象内存分析和小结类与对象

创建对象内存分析 小结类与对象 package oop;//一个项目应该只存在一个main方法 public class Application {public static void main(String[] args) {/*1.类与对象类是一个模版&#xff1a;抽象对象是一个具体的实例2.方法定义&#xff0c;调用&#xff01;3.对应的引用引用…

【C++】实现Date类的各种运算符重载

上一篇文章只实现了operator操作符重载&#xff0c;由于运算符较多&#xff0c;该篇文章单独实现剩余所有的运算符重载。继续以Date类为例&#xff0c;实现运算符重载&#xff1a; 1.Date.h #pragma once#include <iostream> #include <assert.h>using namespace …

C# EventHandler<T> 示例

新建一个form程序&#xff0c;在调试窗口输出执行过程&#xff1b; 为了使用Debug.WriteLine&#xff0c;添加 using System.Diagnostics; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using S…

[office] Excel2019函数MAXIFS怎么使用?Excel2019函数MAXIFS使用教程 #知识分享#微信#经验分享

Excel2019函数MAXIFS怎么使用&#xff1f;Excel2019函数MAXIFS使用教程 Excel2019函数MAXIFS怎么使用&#xff1f;这篇文章主要介绍了Excel2019函数MAXIFS使用教程,需要的朋友可以参考下 在今年&#xff0c;Excel除了新版本Excel2019&#xff0c;其中有一个新功能MAXIFS函数&am…

SG7050VEN(晶体振荡器SPXO)输出:LVDS低相位抖动

SG7050VEN 提供了从25 MHz到500 MHz的宽广频率范围&#xff0c;2.5V和3.3V供电电压,可以轻松集成到各种电源中&#xff0c;7.0 5.0 1.5 mm 的封装&#xff0c;LVDS输出已成为高速数据传输的首选&#xff0c;它提供了低功耗和高速率的优势&#xff0c;同时还能最小化电磁干扰。…

【网工】华为设备命令学习(防火墙)

实验目的PC1连接到外网。 关于防火墙的其他知识后续补充。 ensp里的防火墙 用户名admin 密码Admin123 防火墙的接口类型 1.路由模式 物理口可以直接配. ​​​​​2.交换模式 物理口不能直接配IP&#xff0c;类似交换机&#xff0c;可以配vlan 首先我们先要对各个设备进…

揭开Markdown的秘籍:引用|代码块|超链接

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Markdown指南、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️Markdown 引用1.1 &#x1f514;引用1.2 &#x1f514;嵌套引用1.3 &…

基于FFmpeg+openCV的视频语音通讯系统

FlashMeeting是一整套先进的以FFmpegopenCV技术为基础的视频语音通讯系统。利用该系统可以灵活搭建出诸如视频会议、在线访谈、在线招聘、远程教育、在线招标、在线客服等个性鲜明的应用程序。基于FFmpegopenCV技术的跨平台性&#xff0c;该系统除了可以运行于PC&#xff08;Wi…

使用Apache ECharts同时绘制多个统计图表

目录 1、介绍 2、相关知识 3、代码 4、效果 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Python人工智能开发和前端开发。 …

深入理解Redis哨兵原理

哨兵模式介绍 在深入理解Redis主从架构中Redis 的主从架构中&#xff0c;由于主从模式是读写分离的&#xff0c;如果主节点&#xff08;master&#xff09;挂了&#xff0c;那么将没有主节点来服务客户端的写操作请求&#xff0c;也没有主节点给从节点&#xff08;slave&#…

实例观察 c 语言中 volatile 的作用

volatile 意思是易变的。 在 c 语言中&#xff0c;如果变量被 volatile 修饰&#xff0c;就是告诉编译器这个变量随时都可能发生变化&#xff0c;那么每次读取变量的时候都会到内存中读取。 如果变量没有被 volatile 修饰&#xff0c;并且编译器发现在多次读取变量之间&#…

7.JS里表达式,if条件判断,三元运算符,switch语句,断点调试

表达式和语句的区别 表达式就是可以被求值的代码比如什么a 1 语句就是一段可以执行的代码比如什么if else 直接给B站的黑马程序员的老师引流一波总结的真好 分支语句 就是基本上所有的语言都会有的if else 语句就是满足不同的条件执行不同的代码&#xff0c;让计算机有条件…

智慧供应链控制塔大数据解决方案

一、供应链控制塔的概念定义 (1) Gartner 的定义: “控制塔是一个物理或虚拟仪表板,提供准确的、及时的、完整的物流事件和数据,从组织和服务的内部和跨组织运作供应链,以协调所有相关活动。”、“供应链控制塔…提供供应链端到端整体可见性和近实时信息和决策的概念……

ClickHouse--11--ClickHouse API操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Java 读写 ClickHouse API1.1 首先需要加入 maven 依赖1.2 Java 读取 ClickHouse 集群表数据JDBC--01--简介 ClickHouse java代码 1.3 Java 向 ClickHouse 表中写…

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘&#xff0c;实现服务器存储资源的统一整合、管理及调度&#xff0c;最终向上层提供NFS、ISCSI存储接口&#xff0c;供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

数据库数据加密的 4 种常见思路的对比

应用层加解密方案数据库前置处理方案磁盘存取环节&#xff1a;透明数据加密DB 后置处理 最近由于工作需要&#xff0c;我对欧洲的通用数据保护条例做了调研和学习&#xff0c;其中有非常重要的一点&#xff0c;也是常识性的一条&#xff0c;就是需要对用户的个人隐私数据做好加…