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

C++STL容器详解——list

目录

一.list

1.list的介绍

2.为什么会有list?

二.list的常见接口

1.list的构造函数

2.list的遍历

3.迭代器类型

4.list的头插头删和尾插尾删

5.list任意位置的插入和删除

6.list的sort()及reverse()

7.迭代器失效

三.整体代码


一.list

1.list的介绍

list的文档说明

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

2.为什么会有list?

list是为了补充vector的缺点

vector缺点:

  1. 头部和中部的删除和插入效率低.O(N),因为需要挪动数据
  2. 插入数据空间不够需要增容.增容需要开辟新空间,拷贝数据,释放旧空间,会付出很大代价

优点:

  1. 支持下标的随机访问.间接的就很好支持排序,二分查找,堆算法等.

list优点:

  1. list头部和中间插入不需要挪动数据,效率高.O(1)
  2. list插入数据是新增节点,不需要增容

缺点:

  1. 不支持随机访问

所以实际使用中vector和list是相辅相成

二.list的常见接口

list的接口较为简单,学会使用vector,list的接口基本差不多,主要在下节了解如何实现list

1.list的构造函数

void print_list(const list<int>& lt)
{list<int>::const_iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";++it;}cout << endl;
}void test_list1()
{//带头双向循环的链表list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);print_list(lt1);list<int> lt2(lt1);print_list(lt2);list<int> lt3;lt3.push_back(10);lt3.push_back(20);lt3.push_back(30);lt3.push_back(40);lt1 = lt3;print_list(lt1);
}

lt1创建了一个对象并向其中尾插书局,lt2拷贝构造lt1,lt3赋值给lt1

2.list的遍历

在vector和string中我们都可以通过[ ] + 下标遍历,但是在list中是不允许的,因为list底层是链表,不想数组是连续的,可以直接访问

1.迭代器遍历

	list<int>::iterator it = lt1.begin();while (it != lt1.end()){cout << *it << " ";++it;}cout << endl;

2.范围for遍历

for (auto ch : lt1)
{cout << ch << " ";
}
cout << endl;

3.迭代器类型

迭代器类型从方向可以分为正向,反向,从属性分为普通和const

list<int>::iterator it = lt1.begin();
while (it != lt1.end())
{cout << *it << " ";++it;
}
cout << endl;list<int>::reverse_iterator rit = lt1.rbegin();
while (rit != lt1.rend())
{cout << *rit << " ";++rit;
}
cout << endl;list<int>::const_iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;	
}
cout << endl;

4.list的头插头删和尾插尾删

void test_list2()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_front(0);lt.push_front(-1);print_list(lt);lt.pop_back();lt.pop_front();print_list(lt);
}

5.list任意位置的插入和删除

void test_list3()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);lt.push_back(6);print_list(lt);list<int>::iterator pos = find(lt.begin(), lt.end(), 3);if (pos != lt.end()){lt.insert(pos, 30);lt.erase(pos);}print_list(lt);
}

6.list的sort()及reverse()

void test_list4()
{list<int> lt;lt.push_back(5);lt.push_back(8);lt.push_back(2);lt.push_back(6);lt.push_back(4);lt.sort();print_list(lt);lt.reverse();print_list(lt);
}

虽然可以通过sort直接排序,reverse逆序,但是平时并不经常使用,效率低

7.迭代器失效

当我们想要删除list中的偶数

void test_list5()
{list<int> lt;lt.push_back(3);lt.push_back(2);lt.push_back(1);lt.push_back(5);lt.push_back(4);lt.push_back(6);list<int>::iterator it = lt.begin();while(it!=lt.end()){if (*it % 2 == 0){lt.erase(it);++it;}}print_list(lt);
}

会发现程序崩溃

这是因为迭代器失效了,当我们删除的时候就要注意这一点

void test_list5()
{list<int> lt;lt.push_back(3);lt.push_back(2);lt.push_back(1);lt.push_back(5);lt.push_back(4);lt.push_back(6);list<int>::iterator it = lt.begin();while(it!=lt.end()){if (*it % 2 == 0){it = lt.erase(it);}else{++it;}}print_list(lt);
}

三.整体代码

#include<iostream>
#include<list>
using namespace std;void print_list(const list<int>& lt)
{list<int>::const_iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";++it;}cout << endl;
}void test_list1()
{//带头双向循环的链表list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);print_list(lt1);list<int>::iterator it = lt1.begin();while (it != lt1.end()){cout << *it << " ";++it;}cout << endl;for (auto ch : lt1){cout << ch << " ";}cout << endl;list<int>::reverse_iterator rit = lt1.rbegin();while (rit != lt1.rend()){cout << *rit << " ";++rit;}cout << endl;list<int> lt2(lt1);print_list(lt2);list<int> lt3;lt3.push_back(10);lt3.push_back(20);lt3.push_back(30);lt3.push_back(40);lt1 = lt3;print_list(lt1);
}void test_list2()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_front(0);lt.push_front(-1);print_list(lt);lt.pop_back();lt.pop_front();print_list(lt);
}void test_list3()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);lt.push_back(6);print_list(lt);list<int>::iterator pos = find(lt.begin(), lt.end(), 3);if (pos != lt.end()){lt.insert(pos, 30);lt.erase(pos);}print_list(lt);
}void test_list4()
{list<int> lt;lt.push_back(5);lt.push_back(8);lt.push_back(2);lt.push_back(6);lt.push_back(4);lt.sort();print_list(lt);lt.reverse();print_list(lt);
}void test_list5()
{list<int> lt;lt.push_back(3);lt.push_back(2);lt.push_back(1);lt.push_back(5);lt.push_back(4);lt.push_back(6);list<int>::iterator it = lt.begin();while(it!=lt.end()){if (*it % 2 == 0){it = lt.erase(it);}else{++it;}}print_list(lt);
}int main()
{//test_list1();//test_list2();//test_list3();//test_list4();test_list5();
}

相关文章:

C++STL容器详解——list

目录 一.list 1.list的介绍 2.为什么会有list? 二.list的常见接口 1.list的构造函数 2.list的遍历 3.迭代器类型 4.list的头插头删和尾插尾删 5.list任意位置的插入和删除 6.list的sort()及reverse() 7.迭代器失效 三.整体代码 一.list 1.list的介绍 list的文档说…...

linux tar 打包为多个文件

将目录打包成多个大小为 80MB 的文件&#xff0c;可以使用以下命令&#xff1a; tar -cf - my_folder | split -b 80m - my_folder.tar.解释&#xff1a; tar -cf - my_folder 将 my_folder 目录打包成一个 tar 文件并通过管道 (|) 输出到标准输出。 split -b 80m - my_fold…...

json字符串与python字典的区别与联系

json字符串与python中自带的字典类型外表长的很像&#xff0c;很容易区分不清楚&#xff0c;它们之间有着本质的区别&#xff0c;可以通过内置的json模块来互相转换。 文章目录 1、Python字典2、JSON数据格式3、JSON与python字典的区别4、JSON与python字典相互转换4.1 json字符…...

数据结构-链表【chapter1】【c语言版】

目录 1 链表的优势&#xff1a; 2 链表的组成: 3.一般使用结构体的形式来实现链表&#xff1a; 4.单向链表实现(创建&#xff0c;遍历&#xff0c;释放)&#xff1a; 4.1代码关键点备注&#xff1a; 5.查找节点&#xff1a; 5.1.按值查找节点 5.2.按位置查找节点 5.3 …...

OJ05:989. 数组形式的整数加法

目录 题目思路分析代码展示 题目 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如&#xff0c;对于 num 1321 &#xff0c;数组形式是 [1,3,2,1] 。 给定 num &#xff0c;整数的 数组形式 &#xff0c;和整数 k &#xff0c;返回 整数 num k 的 数组形…...

山东布谷科技:关于直播源码|语音源码|一对一直播源码提交App Store的流程及重构建议

自从YY、六间房开启国内聊天室和秀场等网红盛行的网络红利时代以来&#xff0c;紧随其后国内各大音视频平台相应出现&#xff0c;先有映客花椒等直播平台的风头正劲&#xff0c;后有功能板块更丰富的头条抖音Tiktok等&#xff0c;盈利功能点不仅仅有直播PK连麦等礼物打赏功能&a…...

docker搭建guacamole,web远程桌面

Apache Guacamole 是一个客户端无插件的远程桌面网关。它支持标准协议&#xff0c;如 VNC、RDP 和 SSH。您可以使用任何现代 web 浏览器连接到您的桌面环境&#xff0c;而无需安装额外的软件。使用 Docker Compose 部署 Guacamole&#xff0c;如果没有docker-compose请先执行su…...

.baxia勒索病毒来袭:数据恢复与防护措施详解

导言 在当今这个信息化高速发展的时代&#xff0c;数据已成为企业和个人的核心资产&#xff0c;其价值不可估量。然而&#xff0c;随着网络技术的不断进步&#xff0c;网络安全威胁也日益严峻&#xff0c;其中勒索病毒作为一种新型的网络攻击手段&#xff0c;尤其是.baxia勒索…...

[UUCTF 2022 新生赛]ezpop 详细题解(字符串逃逸)

知识点: php反序列化字符串逃逸 php反序列化魔术方法 构造pop链 变量引用 其实这一题还是比较简单的,只要看懂代码,并且理解为什么要用反序列化字符串逃逸,下面会详细解释 题目源码: <?php //flag in flag.php error_reporting(0); class UUCTF{public $name,$key,$…...

【Zynq UltraScale+ RFSoC】DFE

DFE : digital front-end 数字前端 Xilinx Zynq RFSoC DFE 是一款突破性的灵活应变无线电平台&#xff0c;可强化数字前端 &#xff08;DFE&#xff09;&#xff0c;用于 5G 大规模无线电部署和广泛的其他射频应用。 Zynq RFSoC DFE 基于唯一经过生产验证的自适应单芯片无线电…...

Ubuntu学习笔记 - Day3

文章目录 学习目标&#xff1a;学习内容&#xff1a;学习笔记&#xff1a;vim简介vim键盘图工作模式 vim移动光标操作上下左右移动翻页 vim替换和删除操作替换删除 vim插入模式详解进入模式搜索 vim底行模式操作保存退出行号 学习目标&#xff1a; 一周掌握 Linux基本使用技巧 …...

scala list系列

dd list:有序的&#xff0c;链表 1.建立 不可变列表 2.通过下标来访问&#xff1a;下标从0开始 3.不能修改 4.添加 5.删除 6.合并 7.查找&#xff0c;判断元素是否存在 8.遍历...

TLS协议基本原理与Wireshark分析_wireshark分析tls协议

01****背 景 随着车联网的迅猛发展&#xff0c;汽车已经不再是传统的机械交通工具&#xff0c;而是智能化、互联化的移动终端。然而&#xff0c;随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中&#xff0c;车辆通过无线网络与其他车辆、基础设施以及云端服务…...

【359】基于springboot的智慧草莓基地管理系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本智慧草莓基地管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…...

【智能算法应用】遗传算法求解车间布局优化问题

摘要 本文研究了基于遗传算法&#xff08;Genetic Algorithm, GA&#xff09;的车间布局优化方法。遗传算法是一种基于自然选择和遗传机制的优化算法&#xff0c;通过编码布局方案、交叉和变异操作生成新的布局个体&#xff0c;选择最优的车间布局方案。实验结果表明&#xff…...

java 中List 的使用

List集合是Collection接口的子接口&#xff0c;其下有两个实现类分别为ArrayList和 LinkedList List是一个接口&#xff0c;不能用new创建对象&#xff0c;需要用 ArrayList类 和 LinkedList类 来创建 特点 有序&#xff1a;存储元素的顺序和取出元素的顺序一致可以重复&…...

CSS学习之Grid网格布局基本概念、容器属性

网格布局 网格布局&#xff08;Grid&#xff09;是将网页划分成一个个网格单元&#xff0c;可任意组合不同的网格&#xff0c;轻松实现各种布局效果&#xff0c;也是目前CSS中最强大布局方案&#xff0c;比Flex更强大。 基本概念 容器和项目 当一个 HTML 元素将 display 属性…...

前后端交互接口(二)

前后端交互接口&#xff08;二&#xff09; 前言 在上一集我们约定了我们前后端交互接口的三条规则。这一集我们就先来看一看我们的一些proto文件。 浅看proto文件 在看文件之前&#xff0c;还是简单谈谈Protobuf Protobuf通过一个.proto文件定义数据结构&#xff0c;这个…...

HarmonyOs DevEco Studio小技巧28--部分鸿蒙生命周期详解

目录 前言 页面和自定义组件生命周期 页面生命周期 onPageShow --- 表示页面已经显示 onPageHide --- 表示页面已经隐藏 onBackPress --- 表示用户点击了返回键 组件生命周期 aboutToAppear --- 表示组件即将出现 onDidBuild --- 表示组件已经构建完成 aboutToDisap…...

STM32(hal库)的msp初始化HAL_TIM_Base_MspInit有什么用?为什么单独设置这个,而不是在timer_init()函数里直接初始化?

在STM32 HAL库中&#xff0c;HAL_TIM_Base_MspInit 函数是一个与定时器&#xff08;TIM&#xff09;相关的底层初始化函数&#xff0c;其名称中的 "Msp" 代表 MCU Service Package&#xff08;微控制器服务包&#xff09;&#xff0c;这是HAL库的一部分&#xff0c;用…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...