C++——STL容器之list链表的讲解

目录

一.list的介绍

二.list类成员函数的讲解

        2.2迭代器

三.添加删除数据:

        3.1添加:

        3.2删除数据

 四.排序及去重函数:

错误案例如下:

方法如下:


一.list的介绍

        list列表是序列容器,允许在序列内的任何位置执行插入元素或者删除元素等操作。list列表容器的底层是由链表封装而成,并且该链表的类型还是带头双向循环链表。

二.list类成员函数的讲解

        对于list容器的成员函数们, 它们与vector与String容器的功能作用相差不大,都是增删查改,能够通过迭代器遍历或者修改容器中某个元素的数据。由于前者与后两者底层类型的不同,侧面表现出了list容器的使用是即插即用, 不需要扩容缩容,意味着不会有reserve()、shrink_to_fit()等函数,

       

        2.2迭代器

        list链表容器的迭代器与String和Vector的迭代器也不同,后两者是使用的原生指针,由于连续地址空间的缘故,指针只需要通过增加或者减少类型的字节,便可以定位到具体的位置。

        而对于List容器而言,它的元素是一个接一个的节点,每个节点是由指针相连,所以各个节点的地址并不是连续的,那么使用原生指针去寻找元素位置会相当复杂,所以list的迭代器是一种新型迭代器,采用自定义类型制造而出。

        虽说list迭代器的底层与string,vector的迭代器并不同,但是使用方式都一样:

vector<T>:: iterator vt=v.begin();

String:: iterator st=s.begin();

list<T>::iterator lt=l.begin();

都是通过类域加作用域限定符 iterator的方式去定义。 

         在迭代器中,也是分为普通迭代器、const迭代器、反向迭代器、const反向迭代器。其各个成员作用也与之前讲String、vector容器一样,这里就不再过多讲解了。不清楚的话可以翻一翻我之前写的String和vector容器的讲解.

 这里直接上练习代码:

#include<iostream>
#include<list>
int main(){list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);for (auto& e:l1) {cout << e << " ";}cout << endl;list<int>::iterator lit1 = l1.begin();while (lit1 != l1.end()) {cout << ++(*lit1) << " ";++lit1;}cout << endl;cout << "--------------------------------------------" << endl;//反向迭代器list<int>::reverse_iterator lit2 = l1.rbegin();while (lit2 != l1.rend()) {cout << ++(*lit2) << " ";++lit2;}cout << endl;//const反向迭代器list<int>::const_reverse_iterator lit3 = l1.crbegin();while (lit3!= l1.crend()) {cout << (*lit3) << " ";//cout << ++(*lit3) << " ";			//报错++lit3;}cout << endl;//const正向迭代器list<int>::const_iterator lit4 = l1.cbegin();while (lit4 != l1.cend()) {//cout << ++(*lit3) << " ";			//报错cout << (*lit4) << " ";++lit4;}cout << endl;}return 0;}

运行结果: 

 

 

 

三.添加删除数据:

        3.1添加:

int main(){list<double> l2;//尾插l2.push_back(9.25);l2.push_back(60.10);l2.push_back(32.19);l2.push_back(58.79);//头插l2.insert(l2.begin(), 3.14);for (auto& e : l2) {cout << e << "  ";}cout << endl;//尾插l2.insert(l2.end(),999.99);for (auto& e : l2) {cout << e << "  ";}cout << endl;//中间插//find是std库函数中的auto pos = find(l2.begin(), l2.end(), 32.19);l2.insert(pos, 46.99);for (auto& e : l2) {cout << e << "  ";}cout << endl;//头插push_frontl2.push_front(12.66);for (auto& e : l2) {cout << e << "  ";}cout << endl;return 0;}

 

 

        注:对于insert来说,它的形参需要指定指针类型的pos位置,而pos位置需要自己去定位链表,上图代码中我是通过库函数find去进行定位的,list容器本身并不会提供find函数,因为库中的find函数形参以及返回值就可以很好的帮助我们进行定位。

并且之前我讲过vector容器中,insert函数会引发指针失效问题,在list中,insert函数不会引发该问题。

 

 

 

        3.2删除数据

    list<char> l2;l2.push_back('a');l2.push_back('b');l2.push_back('c');l2.push_back('d');for (auto& e : l2) {cout << e << "  ";}cout << endl;//尾删l2.pop_back();for (auto& e : l2) {cout << e << "  ";}cout << endl;//头删l2.pop_front();for (auto& e : l2) {cout << e << "  ";}cout << endl;//中间删——erasel2.push_back('h');l2.push_back('i');l2.push_back('j');l2.push_back('k');for (auto& e : l2) {cout << e << "  ";}cout << endl;//find是std库函数中的auto pos = find(l2.begin(), l2.end(), 'p');//l2.erase(pos);		//找不到的删会报异常for (auto& e : l2) {cout << e << "  ";}cout << endl;pos = find(l2.begin(), l2.end(), 'h');l2.erase(pos);for (auto& e : l2) {cout << e << "  ";}cout << endl;

运行结果: 

 

 

 四.排序及去重函数:

 

void Test6() {list<int> l1;l1.push_back(34);l1.push_back(100);l1.push_back(26);l1.push_back(79);l1.push_back(83);l1.push_back(0);l1.push_back(34);l1.push_back(55);l1.push_back(13);for (auto& e : l1) {cout << e << " ";}cout << endl;//排序l1.sort();for (auto& e : l1) {cout << e << " ";}cout << endl;}

 

 sort()函数可对list对象的元素进行整体排序。

        去重就是对该链表对象进行遍历,将元素值相同的多个元素进行删除,只保留唯一一个值节点 。

 

对上面对象l1进行元素去重:

l1.unique();cout << "去重后的链表:";for (auto& e : l1) {cout << e << " ";}cout << endl;

结果: 

 

        这里讲一下unique函数的真正用法,虽然unique函数可以对链表进行元素去重,但前提是该链表一定处于完全有序的状态才行!!! 

        若链表不是有序的,去重也就是无效的!!!

错误案例如下:

    list<int> l2;l2.push_back(34);l2.push_back(100);l2.push_back(26);l2.push_back(79);l2.push_back(83);l2.push_back(0);l2.push_back(34);l2.push_back(55);l2.push_back(13);cout << "原链表:";for (auto& e : l2) {cout << e << " ";}cout << endl;l2.unique();//注:34仍是俩个,没有被去除cout << "去重后的链表:";for (auto& e : l2) {cout << e << " ";}cout << endl;

 

        原链表是无序的,使用unique函数后,该链表还是有多个重复元素存在!

        最后强调一下:list容器的sort排序函数并不好用,排序效率低下,尽量少用!若想进行高效排序,可以利用vector容器搭配std库中的sort函数进行。 

方法如下:

void Test_Sort(){list<int> lt1;lt1.push_back(15);lt1.push_back(9);lt1.push_back(3);lt1.push_back(10);lt1.push_back(80);    lt1.push_back(5);lt1.push_back(-3);lt1.push_back(0);lt1.push_back(42);//假设链表中有这么多数据vector<int> v;    //创建vector对象v.reserve(9);    //根据链表对象的数据个数开辟空间//通过遍历lt1链表,将链表中的数据一个一个尾插到vector对象v中,for (auto e : lt1){v.push_back(e);}//使用vector方式进行std库中的sort排序sort(v.begin(), v.end());size_t i = 0;//最后将vector排好序的数据在传回lt1中for (auto& e : lt1){e = v[i++];}}

        若是list容器对象需要排序的数据量过大的话,利用vector排序+sort的方式可比直接用list.sort()效率要高很多很多。

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

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

相关文章

css实现鼠标滑动左下角弹框带动画效果

代码 <div classNamekuang></div> css代码 .kuang {height: 500px;width: 400px;// background-color: #fff;position: absolute;z-index: 10;bottom: 0;transform: translateX(-390px)}.kuang:hover {animation: myanimation 3s linear 1;animation-fill-mode:f…

Flowable-中间事件-空中间抛出事件

定义 空中间抛出事件是一个 Throwing 事件&#xff0c;在 intermediateThrowEvent 元素下不加入任何的事件定 义元素&#xff0c;就构成一个空中间抛出事件。它通常用于表示流程中的某个状态&#xff0c;在实际使用的过程中可 以通过添加执行监听器&#xff0c;来表示流程状态…

算法通关村第二关——两两交换链表中的节点的问题解析

题目类型 链表反转 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点&#xff0c;且必须在不修改节点内部的值的情况下完成本题&#xff0c;即&#xff1a;只能进行节点交换 效果图 题目分析 如果原始顺序是 dummy(虚拟头节点) …

Linux学习之系统函数库

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64&#xff0c;bash --version可以bash的版本是4.2.46。 在/etc/init.d/functions有许多系统定义好的函数&#xff0c;比如…

基于ChatGPT聊天的零样本信息提取7.25

基于ChatGPT聊天的零样本信息提取 摘要介绍ChatIE用于零样本IE的多轮 QA 实验总结 摘要 零样本信息提取&#xff08;IE&#xff09;旨在从未注释的文本中构建IE系统。由于很少涉及人类干预&#xff0c;因此具有挑战性。 零样本IE减少了数据标记所需的时间和工作量。最近对大型…

DevOps-Jenkins

Jenkins Jenkins是一个可扩展的持续集成引擎&#xff0c;是一个开源软件项目&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 官网 应用场景 场景一 研发人员上传开发好的代码到github代码仓库需要将代码下载nginx服务器部署手动下载再…

递归实现 组合问题+排列问题(DFS)

目录 递归实现排列型枚举 递归实现排列类型枚举 II 递归实现组合型枚举 递归实现组合型枚举 II 递归实现指数型枚举 递归实现指数型枚举 II 递归不是循环&#xff0c;递归利用了系统栈&#xff0c;只要是函数都会被系统管理。当执行到函数地址入口时就会为函数在系统栈上分…

mac 删除自带的ABC输入法保留一个搜狗输入法,搜狗配置一下可以减少很多的敲击键盘和鼠标点击次数

0. 背景 对于开发者来说&#xff0c;经常被中英文切换输入法所困扰&#xff0c;我这边有一个方法&#xff0c;删除mac默认的ABC输入法 仅仅保留搜狗一个输入法&#xff0c;配置一下搜狗输入&#xff1a;哪些指定为英文输入&#xff0c;哪些指定为中文输入&#xff08;符号也可…

wps图表怎么改横纵坐标,MLP 多层感知器和CNN卷积神经网络区别

目录 wps表格横纵坐标轴怎么设置&#xff1f; MLP (Multilayer Perceptron) 多层感知器 CNN (Convolutional Neural Network) 卷积神经网络 多层感知器MLP&#xff0c;全连接网络&#xff0c;DNN三者的关系 wps表格横纵坐标轴怎么设置&#xff1f; 1、打开表格点击图的右侧…

arm 函数栈回溯

大概意思就是arm每个函数开始都会将PC、LR、SP以及FP四个寄存器入栈。 下面我们看一下这四个寄存器里面保存的是什么内存 arm-linux-gnueabi-gcc unwind.c -mapcs -w -g -o unwind&#xff08;需要加上-mapcs才会严格按照上面说的入栈&#xff09; #include <stdio.h> …

Android 面试题 线程间通信 六

&#x1f525; 主线程向子线程发送消息 Threadhandler&#x1f525; 子线程中定义Handler&#xff0c;Handler定义在哪个线程中&#xff0c;就跟那个线程绑定&#xff0c;在线程中绑定Handler需要调用Looper.prepare(); 方法&#xff0c;主线程中不调用是因为主线程默认帮你调用…

怎么在线修改图片?分享一个图片修改工具

无论是在个人或商业领域&#xff0c;我们都需要使用高质量的图片来传达信息或提高品牌形象。大尺寸的图片也会占据大量的存储空间和带宽&#xff0c;影响网站的加载速度和用户体验。因此&#xff0c;我们需要一种高效的工具来解决这个问题。今天向大家介绍一款非常实用的图片处…

Abaqus 导出单元刚度矩阵和全局刚度矩阵

Abaqus 导出单元刚度矩阵和全局刚度矩阵 首次创建&#xff1a;2023.7.29 最后更新&#xff1a;2023.7.29 如有什么改进的地方&#xff0c;欢迎大家讨论&#xff01; 详细情况请查阅&#xff1a;Abaqus Analysis User’s Guide 一、Abaqus 导出单元刚度矩阵 1.生成单元刚度矩阵…

Linux CentOS快速安装VNC并开启服务

以下是在 CentOS 上安装并开启 VNC 服务的步骤&#xff1a; 安装 VNC 服务器软件包。运行以下命令&#xff1a; sudo yum install tigervnc-server 输出 $ sudo yum install tigervnc-server Loaded plugins: fastestmirror, langpacks Repository epel is missing name i…

教雅川学缠论04-笔

笔由3部分组成&#xff1a; 顶分型K线底分型&#xff0c;或者 底分型K线顶分型 注意&#xff1a;笔加一起至少7根K线&#xff0c;因为一个底分型至少3根&#xff0c;K先至少1个&#xff0c;顶分型至少3根 下图中红色线段就是一个标准的笔&#xff0c;它始于一个底分型&#xff…

Visual C++中的虚函数和纯虚函数(以外观设计模式为例)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候&#xff0c;就用JAVA实现同样的代码&#xff0c;然后再用对比的方法把C学会。 直接说虚函数…

【SpringCloud Alibaba】(四)使用 Feign 实现服务调用的负载均衡

在上一文中&#xff0c;我们实现了服务的自动注册与发现功能。但是还存在一个很明显的问题&#xff1a;如果用户微服务和商品微服务在服务器上部署多份的话&#xff0c;之前的程序无法实现服务调用的负载均衡功能。 本文就带着大家一起实现服务调用的负载均衡功能 1. 负载均衡…

LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据

如题。 效果图&#xff1a; //lazy属性为true&#xff0c;点开时才加载 引用代码&#xff1a; <link href"~/Content/layui-new/css/layui.css" rel"stylesheet" /><form id"form" class"layui-form" style"margin-to…

AC695-按键处理-带UI

AC695-按键修改 消息发出 对应界面处理

【算法和数据结构】257、LeetCode二叉树的所有路径

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先看这道题的输出结果&#xff0c;是前序遍历。然后需要找到从根节点到叶子节点的所有路径&#xff…