当前位置: 首页 > news >正文

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()效率要高很多很多。

相关文章:

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

目录 一.list的介绍 二.list类成员函数的讲解 2.2迭代器 三.添加删除数据&#xff1a; 3.1添加&#xff1a; 3.2删除数据 四.排序及去重函数&#xff1a; 错误案例如下&#xff1a; 方法如下&#xff1a; 一.list的介绍 list列表是序列容器&#xff0c;允许在序列内的任何…...

使用for循环输出左上三角、右上三角、左下三角、右下三角、上下三角

1、输出如下图形&#xff1a; #include<stdio.h> int main() {/*输出图形 666666666666666*/for(int i1;i<5;i){for(int j1;j<i;j){putchar(6);}printf("\n"); } return 0; } 2、输出如下图形&#xff1a; #include<stdio.h> int main() {/*输出图…...

CAXA中.exb或者.dwg文件保存为PDF

通常CAXAZ中的文件为.exb或者.dwg格式&#xff0c;我们想打印或者保存为PDF文件格式&#xff0c;那么就用一下的方法&#xff1a; CAXA文件如图所示&#xff1a; 框选出你要打印的图纸&#xff01;&#xff01;&#xff01;&#xff01; 我们选择"菜单"->"…...

华为刷题:HJ3明明随机数

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int N scan.nextInt();int[] arr new int[N];for (int i 0; i < N; i) {int n sca…...

ENVI提取NDVI与植被覆盖度估算

目标是通过ENVI计算植被覆盖度结合ArcGIS出图得到植被覆盖图。 一、植被覆盖度的定义: 植被覆盖度( FractionalVegetation Cover,FVC) 通常定义为植被( 包括叶、茎、枝) 在地面的垂直投影面积占统计区总面积的百分比,它量化了植被的茂密程度,反应了植被的生长态势,是刻画…...

Arm 扩大开源合作伙伴关系,加强投入开放协作

作者&#xff1a;Arm 开源软件副总裁 Mark Hambleton Arm 和我们的生态系统的关键信念之一是与开源社区合作&#xff0c;共创一个高度发达的 Arm 架构&#xff0c;使软件的落地更加稳定&#xff0c;从而让全球数百万开发者能够测试并创建自己的应用。 为此&#xff0c;Arm 支…...

Kubernetes 的核心概念:Pod、Service 和 Namespace 解析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…...

互联网搜索的学习笔记

1. 参考资料 《Internet Search Tips》《Google Search Operators: The Complete List (42 Advanced Operators)》 2. 预备知识 2.1 查询语法 2.1.1 -&#xff1a;排除符 用于排除指定关键字。例如&#xff0c;如果想搜索“苹果”但不想看到“苹果手机”的结果&#xff0c;…...

vue事件修饰符

vue事件修饰符 1、目标2、语法 1、目标 在事件后面.修饰符名-给事件带来强大功能 2、语法 事件名.修饰符“methods里的函数” 修饰符列表 .stop - 阻止事件冒泡 示例&#xff1a; <template><div id"app"><div click"fatherFn"><…...

【安全】web中的常见编码浅析浏览器解析机制

目录 常见编码 一、ASCII码 二、URL编码 三、Unicode编码 四、HTML实体编码 结合编码理解浏览器解析机制 常见编码 一、ASCII码 ASCII (American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&#xff09; 计算机内部&#xff0…...

Ceph概述、准备ceph部署环境、cephadm概述、安装Ceph集群、ceph块存储、存储池、rbd镜像管理、ceph客户端配置

day03 day03ceph概述部署Ceph节点准备cephadm准备基础环境安装ceph实现块存储块存储基础存储池镜像ceph客户端 ceph概述 ceph可以实现的存储方式&#xff1a; 块存储&#xff1a;提供像普通硬盘一样的存储&#xff0c;为使用者提供“硬盘”文件系统存储&#xff1a;类似于NFS…...

python selenium爬虫自动登录实例

拷贝地址&#xff1a;python selenium爬虫自动登录实例_python selenium登录_Ustiniano的博客-CSDN博客 一、概述 我们要先安装selenium这个库&#xff0c;使用pip install selenium 命令安装&#xff0c;selenium这个库相当于机器模仿人的行为去点击浏览器上的元素&#xff0…...

el-cascader 数据的回显

<el-cascaderplaceholder"试试搜索":options"allOptions":props"{ multiple: true }"v-model"options"filterable style"width: 80%;max-height:240px;overflow-y:scroll;"></el-cascader> allOptions里面包含…...

Java 版 spring cloud +spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

即时通信的方法和webSocket的具体使用

前言 之前遇到过需要即时通讯的场景&#xff0c;刚开始使用的是通过轮询的方式&#xff0c;定时器3秒向服务器请求一次数据&#xff0c;后面发现如果在手机端长时间打开使用此功能的页面&#xff0c;可能会发生手机发热&#xff0c;甚至卡顿的现象。最后改用webSocket&#xf…...

HTML 速查列表

HTML 速查列表 HTML 速查列表. 你可以打印它&#xff0c;以备日常使用。 HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </head> <body> 可见文本... </body> </html> 基本标签&#xff08;Ba…...

Hadoop集成Hive

一、环境与软件准备 说明&#xff1a;服务器已用主机名代替&#xff0c;可根据自己的需求&#xff0c;改为IP地址 环境 服务器组件masterNameNode、DataNode、Nodemanager、ResourceManager、Hive、Hive的metastore、Hive的hiveserver2、mysqlSecondarySecondaryNameNode、D…...

MyBatis查询数据库

目录 一、什么是MyBatis 二、搭建MyBatis开发环境 &#x1f345;添加MyBatis依赖 &#x1f345;在数据库添加数据 &#x1f345;设置MyBatis配置 &#x1f388;数据库的相关连接信息&#x1f388;xml的保存和设置路径 三、使用MyBatis模式和语法操作数据库 &#x1f34…...

RVM问题记录 - Error running ‘__rvm_make -j10‘

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 公司新到一台电脑需要配置开发环境&#xff0c;在用RVM安装Ruby时遇到了一个奇怪的问题。 开发环境 RVM: 1.29.12OpenSSL: 3.1.1 问题描述 执行命令安装Ruby 3.0版本&#xff1a; rvm install ruby-3.0.0在编译阶…...

VIS for AI :ConvNetJS

1.简单介绍&#xff1a; ConvNetJS是由斯坦福大学计算机科学系的Andrej Karpathy开发的一个深度学习框架&#xff0c;用于在浏览器中运行卷积神经网络&#xff08;ConvNet&#xff09;。ConvNetJS可以帮助开发人员在客户端&#xff08;浏览器&#xff09;上进行深度学习任务&a…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

【Redis】Redis从入门到实战:全面指南

Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...