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的文档说明
- list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代
- ist的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素
- list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效
- 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好
- 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)
2.为什么会有list?
list是为了补充vector的缺点
vector缺点:
- 头部和中部的删除和插入效率低.O(N),因为需要挪动数据
- 插入数据空间不够需要增容.增容需要开辟新空间,拷贝数据,释放旧空间,会付出很大代价
优点:
- 支持下标的随机访问.间接的就很好支持排序,二分查找,堆算法等.
list优点:
- list头部和中间插入不需要挪动数据,效率高.O(1)
- list插入数据是新增节点,不需要增容
缺点:
- 不支持随机访问
所以实际使用中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 的文件,可以使用以下命令: tar -cf - my_folder | split -b 80m - my_folder.tar.解释: tar -cf - my_folder 将 my_folder 目录打包成一个 tar 文件并通过管道 (|) 输出到标准输出。 split -b 80m - my_fold…...

json字符串与python字典的区别与联系
json字符串与python中自带的字典类型外表长的很像,很容易区分不清楚,它们之间有着本质的区别,可以通过内置的json模块来互相转换。 文章目录 1、Python字典2、JSON数据格式3、JSON与python字典的区别4、JSON与python字典相互转换4.1 json字符…...
数据结构-链表【chapter1】【c语言版】
目录 1 链表的优势: 2 链表的组成: 3.一般使用结构体的形式来实现链表: 4.单向链表实现(创建,遍历,释放): 4.1代码关键点备注: 5.查找节点: 5.1.按值查找节点 5.2.按位置查找节点 5.3 …...

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

山东布谷科技:关于直播源码|语音源码|一对一直播源码提交App Store的流程及重构建议
自从YY、六间房开启国内聊天室和秀场等网红盛行的网络红利时代以来,紧随其后国内各大音视频平台相应出现,先有映客花椒等直播平台的风头正劲,后有功能板块更丰富的头条抖音Tiktok等,盈利功能点不仅仅有直播PK连麦等礼物打赏功能&a…...
docker搭建guacamole,web远程桌面
Apache Guacamole 是一个客户端无插件的远程桌面网关。它支持标准协议,如 VNC、RDP 和 SSH。您可以使用任何现代 web 浏览器连接到您的桌面环境,而无需安装额外的软件。使用 Docker Compose 部署 Guacamole,如果没有docker-compose请先执行su…...

.baxia勒索病毒来袭:数据恢复与防护措施详解
导言 在当今这个信息化高速发展的时代,数据已成为企业和个人的核心资产,其价值不可估量。然而,随着网络技术的不断进步,网络安全威胁也日益严峻,其中勒索病毒作为一种新型的网络攻击手段,尤其是.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 是一款突破性的灵活应变无线电平台,可强化数字前端 (DFE),用于 5G 大规模无线电部署和广泛的其他射频应用。 Zynq RFSoC DFE 基于唯一经过生产验证的自适应单芯片无线电…...

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

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

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

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

【智能算法应用】遗传算法求解车间布局优化问题
摘要 本文研究了基于遗传算法(Genetic Algorithm, GA)的车间布局优化方法。遗传算法是一种基于自然选择和遗传机制的优化算法,通过编码布局方案、交叉和变异操作生成新的布局个体,选择最优的车间布局方案。实验结果表明ÿ…...
java 中List 的使用
List集合是Collection接口的子接口,其下有两个实现类分别为ArrayList和 LinkedList List是一个接口,不能用new创建对象,需要用 ArrayList类 和 LinkedList类 来创建 特点 有序:存储元素的顺序和取出元素的顺序一致可以重复&…...

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

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

HarmonyOs DevEco Studio小技巧28--部分鸿蒙生命周期详解
目录 前言 页面和自定义组件生命周期 页面生命周期 onPageShow --- 表示页面已经显示 onPageHide --- 表示页面已经隐藏 onBackPress --- 表示用户点击了返回键 组件生命周期 aboutToAppear --- 表示组件即将出现 onDidBuild --- 表示组件已经构建完成 aboutToDisap…...
STM32(hal库)的msp初始化HAL_TIM_Base_MspInit有什么用?为什么单独设置这个,而不是在timer_init()函数里直接初始化?
在STM32 HAL库中,HAL_TIM_Base_MspInit 函数是一个与定时器(TIM)相关的底层初始化函数,其名称中的 "Msp" 代表 MCU Service Package(微控制器服务包),这是HAL库的一部分,用…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...