【C++STL详解(五)】--------list的介绍与使用

目录

前言

一、list的介绍

二、list的使用

Ⅰ.默认成员函数

1、构造函数

2、赋值重载

3、析构函数

Ⅱ、容量

1.size()

Ⅲ、迭代器与遍历

1.begin+end (正向迭代器)

2.rbegin+rend (反向迭代器)

3.front

4.back

Ⅳ、增删查改

1.push_front

2.pop_front

3.push_back

4.pop_back

5.insert

6.erase

7.swap

8.clear()

三、细节问题-迭代器失效


前言

前面在数据结构中我们已经了解到,单链表,带头双向循环链表,那么好!C++中的容器也存在这一些链表,下面来了解了解list,以及它常用的接口,完整文档可看list文档!(PC端打开哦!)使用时一定要记得包对应容器的头文件哦!

一、list的介绍

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
2. list底层是带头双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素
3. listforward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
4. 与其他的序列式容器相比(arrayvectordeque)list通常在任意位置进行插入、移除元素的执行效率更好。
5.与其他序列式容器相比,listforward_list最大的缺陷是不支持任意位置的随机访问!要访问某一位置,需要从已知位置开始遍历到该位置,时间上存在一笔大的开销!

二、list的使用

注意:list 中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list 中一些 常见的重要接口

Ⅰ.默认成员函数

1、构造函数

和前面的vector类似,常见的就四个:

list();    //无参构造
list(size_type n, const value_type& val = value_type());  //构造并初始化n个val
list (const list& x);//拷贝构造
list (InputIterator first, InputIterator last);//迭代器区间构造

具体使用:

list<int> l1;//无参list<int> l2(10, 1);//初始化元素为10个1list<int> l3(l2);//将l2的内容拷贝给l3,并初始化l3list<int> l4(l2.begin(), l2.begin() + 5);//迭代器区间构造

2、赋值重载

list& operator= (const list& x);//使用
list<int> l2(10, 1);//初始化元素为10个1list<int> l5=l2;//赋值

3、析构函数

~list();

这个也是使用自带的即可,实践在底层实现时还是要自己写,因为在底层涉及到空间的申请,需要手动释放!现在使用的容器是直接封装好的,给用户带来我们带来良好的体验!

Ⅱ、容量

1.size()

//原型,获取数据个数
size_type size() const;//使用
list<int> l2(10,1);
cout << l2.size();

2.empty()

l2.empty();//判空

你没看错,这里的list常用就这两个,库里面还有一个叫max_size(),但用得不多!

Ⅲ、迭代器与遍历

1.begin+end (正向迭代器)

begin():返回第一个元素的迭代器

 iterator begin(); 
 const_iterator begin() const;//为const对象提供的

end():返回最后一个元素下一个位置的迭代器

iterator end();

const_iterator end() const;

看代码:

值得注意的是:list的begin和end,不能像vector那样直接begin()+5,而是只能++,实际上是因为底层结构的原因,vector底层是个连续的空间,而list不是!

2.rbegin+rend (反向迭代器)

rbegin():返回第一个元素的reverse_iterator(反向迭代器),即end位置

 reverse_iterator rbegin(); 
 const_reverse_iterator rbegin() const;//为const对象提供的

rend():返回最后一个元素下一个位置的 reverse_iterator,即begin位置

 reverse_iterator rend(); 
 const_reverse_iterator rend() const;

看代码:

还是要注意反向迭代器是反向++,向前走!

3.front

front:返回list的第一个节点中值的引用

reference front();

const_reference front() const;


4.back

back:返回list的最后一个节点中值的引用

reference back);

const_reference back() const;

Ⅳ、增删查改

1.push_front

头插操作。

    void push_front(const value_type & val);

使用范围for遍历是因为有迭代器的存在,这一点不过多赘婿!

2.pop_front

头删操作。

    void pop_front();

3.push_back

尾插操作。

    void push_back(const value_type & val);

4.pop_back

尾删操作。

void pop_back();

5.insert

插入操作:在pos位置前插入一个值,同样需要结合算法库里的find函数去使用!

①特定位置前插入一个值

②特定位置前插入n个val

③在特定位置前插入一段迭代区间(左闭右开)

6.erase

删除操作:删除特定位置或者区间的值!并且返回一个迭代器,这个迭代器指向被删除元素的后一个元素的位置

iterator erase(iterator position);
iterator erase(iterator first, iterator last);

来吧,展示!同样也需要配合find()使用

①删除特定位置的值

②删除特定区间的值(左闭右开)

一定要注意这里是传进去两个迭代器,并且是左闭右开区间,这里写法上和vector一定要注意区分,原因还是因为底层结构的不同!!!

7.swap

主要是交换两个list中的元素 !这个是list内部的成员函数,不是那个算法库里面的全局的swap

    void swap(list & x);

8.clear()

clear:清空 list 中的有效元素

 void clear();

三、细节问题-迭代器失效

这个问题也在vector中涉及,但是对于list而言,它的insert不会存在迭代器失效的问题,因为他并没有引起底层空间的变化!那么它是在哪里会失效呢?就是在删除操作上list迭代器会失效。

原因:

因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代 器失效的,只有在删除时才会失效,并且 失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响
看代码:
解决方案还是一样:如果还是要使用就更新;
这里能这样写是因为erase它是由返回值的, 返回一个迭代器,这个迭代器指向被删除元素的后一个元素的位置

今天的分享就到这里!感谢你的观看与指导!

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

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

相关文章

c3 笔记7 css基本语法

相关内容&#xff1a;字体、段落、词间距、文字效果&#xff08;对齐、上下标、阴影&#xff09;、背景图、背景渐变、…… 单位pt与px的差别pt是印刷使用的字号单位&#xff0c;不管屏幕分辨率是多少&#xff0c;打印到纸上看起来都是相同的&#xff0c;lot的长度是0.01384英寸…

【STM32+HAL】SDIO+DMA模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片&#xff1a; STM32F407ZGT6 2、IDE&#xff1a; MDK-Keil软件 3、库文件&#xff1a;STM32F4xxHAL库 三、实现功能 实现用SDIODMA读写S…

05_机器学习赛事_优惠券使用预测

1. 函数库导入 # import libraries necessary for this project import os, sys, pickleimport numpy as np import pandas as pdimport matplotlib.pyplot as plt import matplotlib.dates as mdatesimport seaborn as sns import datetime as dtfrom datetime import datefr…

如何删除BigKey

③第三方工具 利用第三方工具&#xff0c;如 Redis-Rdb-Tools 分析RDB快照文件&#xff0c;全面分析内存使用情况https://github.com/sripathikrishnan/redis-rdb-tools ④网络监控 自定义工具&#xff0c;监控进出Redis的网络数据&#xff0c;超出预警值时主动告警一般阿里…

拼多多新店和老店哪个好做

拼多多新店和老店哪个好做 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金&#xff0c;不成交不扣费。是商…

34.Docker基本操作

镜像相关的命令 镜像名称分为两部分组成&#xff1a;[repository]:[tag],tag就是镜像的版本。如果tag没有指定默认就是latest,表示最新版本的镜像。 查看docker命令的帮助信息 docker --help 具体某条命令的帮助信息 docker images --help 案例一&#xff1a;从DockerHub中…

5G赋能 扬帆未来|AGV无人仓成黑科技“顶流”

AGV 近年来&#xff0c;无人化这个概念逐渐被运用到了社会中的各个行业&#xff0c;而跟物流有关的就有无人分拣机器人、无人驾驶卡车、和无人叉车&#xff0c;越来越多的新装备也开始投入到实际运用中。 仓储管理在物流管理中占据着核心地位。传统的仓储管理中存在诸多的弊端…

发卡盗u源码系统搭建ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.ssl不强https

SQL数据库

一.什么是数据库 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储。&#xff08;database 简称DB&#xff09; 数据库管理系统&#xff1a;管理数据库的大型软禁&#xff08;DataBase Management System 简称DBMS&#xff09; SQL&#xff1a;操作关系…

Golang | Leetcode Golang题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; func uniquePathsWithObstacles(obstacleGrid [][]int) int {n, m : len(obstacleGrid), len(obstacleGrid[0])f : make([]int, m)if obstacleGrid[0][0] 0 {f[0] 1}for i : 0; i < n; i {for j : 0; j < m; j {if obstacleGrid[i]…

《读懂财务报表》手绘版读书笔记:通过报表找好公司

通过财报的三张表判断好公司&#xff1a; 然后是在三表中&#xff0c;计算各个项目占总体的比例&#xff0c;以及做比率分析&#xff0c; 比率分析&#xff0c;从偿还能力&#xff0c;运营能力&#xff0c;盈利能力三方面分析&#xff1a; 1&#xff09; 偿还能力 2&#xff09…

【工具】--- Adobe Illustrator 下载-入门绘图

文章目录 软件下载入门项目可看课程 尝试使用Adobe Illustrator&#xff08;设计师常用软件&#xff09;进行科研绘图。 软件下载 阿里云盘下载 入门项目 绘制一个箭头并保持为SVG&#xff0c; 直线->画线->窗口->描边->选择想要的箭头样式->颜色->改为蓝…

Python量化炒股的获取数据函数—get_index_weights()

Python量化炒股的获取数据函数—get_index_weights() 获取指数成分股权重函数get_index_weights()可以获取一个指数给定日期在平台交易的成分股权重&#xff0c;其语法格式如下&#xff1a; get_index_weights(index_id, dateNone)该函数的参数与获取指数成分股代码函数get_i…

人工智能|推荐系统——工业界的推荐系统之概要

以小红书为例的推荐系统的转化流程&#xff0c;用户看到内容就是曝光&#xff0c;可以点击进去&#xff0c;然后进行一些“交互”行为&#xff0c;比如评论、点赞、收藏、转发。 通常会考虑用户的一些消费指标 而从推荐系统的角度则会考虑一些北极星指标&#xff0c;也就是优化…

微信小程序demo-----制作文章专栏

前言&#xff1a;不管我们要做什么种类的小程序都涉及到宣传或者扩展其他业务&#xff0c;我们就可以制作一个文章专栏的页面&#xff0c;实现点击一个专栏跳转到相应的页面&#xff0c;页面可以有科普类的知识或者其他&#xff0c;然后页面下方可以自由发挥&#xff0c;添加联…

OBD读取车辆里程数

OBD(On-Board Diagnostics)系统可以通过车辆的OBD接口读取多种车辆数据,但关于里程数的读取,情况稍微复杂一些。以下是关于通过OBD读取车辆里程数的详细解释: OBD输出信息中与里程相关的数据: 在标准的OBD输出信息中,并不直接提供车辆的总里程数。它主要提供的是与故障相…

spring boot学习第十八篇:使用clickhouse

1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

ConcurrentLinkedQueue 原理

文章目录 1. 模仿 ConcurrentLinkedQueue 1. 模仿 ConcurrentLinkedQueue ConcurrentLinkedQueue 的设计与 LinkedBlockingQueue 非常像&#xff0c;也是 两把【锁】&#xff0c;同一时刻&#xff0c;可以允许两个线程同时&#xff08;一个生产者与一个消费者&#xff09;执行…

Node.js -- MongoDB

文章目录 1. 相关介绍2. 核心概念3. 命令行交互3.1数据库命令3.2 集合命令3.3 文档命令 4. 数据库应用场景4.1 新增4.2 删除4.3 更新4.4 查询 5. 图形化工具Robo 3T 1. 相关介绍 一、简介 Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库&#xff0c;官方地址https://…

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中&#xff0c;我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中&#xff0c;我们将更进一步&#xff0c;使用美国手语字母表&#xff08;ASL&#xff09;数据集来构建一个定制化的图像分类模型。通过这个过程&#xff0c;…