STL list基本用法
目录
- list的使用
- 构造函数和赋值重载
- 迭代器(最重要)
- 容量相关
- 插入删除
- 元素操作
- reverse
- sort
- unique
- remove
- splice
list的底层实际是双向链表结构
list的使用
构造函数和赋值重载
构造函数 | 说明 |
---|---|
list() | 无参构造 |
list (size_type n, const value_type& val = value_type()) | 构造的list中包含n个值为val的元素 |
list (const list& x) | 拷贝构造函数 |
list (InputIterator first, InputIterator last) | 用[first, last)区间中的元素构造list |
构造函数和前面的容器用法相同
void test1()
{list<int> lt1;//无参构造list<int> lt2(10, 1);//1,1,1,1,1,1,1,1,1,1list<int> lt3(lt2);//拷贝构造list<int> lt4(lt2.begin(), lt2.end());
}
赋值重载
list& operator= (const list& x);
void test1()
{list<int> lt1;//无参构造list<int> lt2(10, 1);//1,1,1,1,1,1,1,1,1,1list<int> lt3(lt2);//拷贝构造list<int> lt4(lt2.begin(), lt2.end());list<int> lt5;lt5 = lt4;//赋值重载
}
迭代器(最重要)
迭代器类型分为三种:单向迭代器、双向迭代器、随机迭代器
单向迭代器:支持++ 例如forward_list、哈希的迭代器类型是单向迭代器
双向迭代器:支持++,- - 例如list、map、set的迭代器类型是双向迭代器
随机迭代器:支持++,- -,+,- 例如vector、string、deque的迭代器类型是随机迭代器
随机迭代器可以认为是特殊的双向迭代器,双向迭代器可以认为是特殊的单向迭代器
list的迭代器与vector
和string
不同
迭代器的类型是与容器底层结构决定的
vector
和string
的底层是连续的,所以它们的迭代器实际上就是指针,所以它们支持++,–,+,- ,类型是随机迭代器
而list
的底层是不连续的,前后是通过指针连接在一起的,所以它的迭代器不是指针(实际上是指针经过封装),经过封装后,迭代器会支持++、- -,类型是单向迭代器
对于不支持
+
,-
,这样封装是因为:像it.begin()+5
这样的效率太低,C++不支持
list的迭代器不支持像vector中的it.begin()+5
,如果这样写会报错
只支持++
,--
void test2()
{list<int> lt{ 1,2,3,4,5,6 };lt.begin()--;lt.begin()++;
}
如果想将list
的迭代器像vector
中it.begin()+5
一样移动多个位置,只能这样:
void test2()
{list<int> lt{ 1,2,3,4,5,6 };list<int>::iterator it = lt.begin();for (size_t i = 0; i < 5; i++){++it;}
}
剩下的,list
迭代器也支持之前的函数,用法也相同
容量相关
empty
bool empty() const;
判断容器是否为空
size
size_type size() const;
返回容器中元素的个数
插入删除
list
作为双向循环链表,头插,头删,尾插,尾删的效率都很高,所以list中都支持这些操作
函数 | 说明 |
---|---|
void push_front (const value_type& val); | 在list首元素前插入值为val的元素 |
void pop_front(); | 删除list中第一个元素 |
void push_back (const value_type& val); | 在list尾部插入值为val的元素 |
void pop_back(); | 删除list中最后一个元素 |
void test3()
{list<int> lt{ 1,2,3,4,5,6 };lt.push_back(10);lt.push_front(0);lt.pop_back();lt.pop_front();
}
insert
iterator insert (iterator position, const value_type& val);void insert (iterator position, size_type n, const value_type& val);template <class InputIterator>void insert (iterator position, InputIterator first, InputIterator last);
insert
的操作和vector
中的用相同,但是这个insert
不会导致迭代器失效
因为链表的插入必须要扩容,迭代器是指向某一个节点,插入后迭代器还是指向原先的节点,不会导致失效
erase
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
erase
的操作和vector
中的用相同,这个erase
会导致迭代器失效
迭代器是指向某一个节点,删除这个节点后,迭代器失效
元素操作
reverse
void reverse();
这个reverse
是list
类中自带的一个函数,作用是逆置链表
而<algorithm>
中也有一个reverse
函数
reverse
函数中迭代器类型是双向迭代器,而list的迭代器类型就是双向迭代器,所以list也可以使用<algorithm>
中的reverse
void test4()
{list<int> lt{ 1,2,3,4,5,6 };lt.reverse();reverse(lt.begin(), lt.end());
}
sort
void sort();
作用是排序,底层是归并
<algorithm>
中也有sort
函数,但是对于list来说,想要排序,只能使用list
库中的sort
函数,不能使用<algorithm>
中也有sort
因为list的迭代器类型是双向迭代器,而<algorithm>
中的sort
的参数迭代器的类型是随机迭代器,所以list不能使用<algorithm>
中的sort
函数。
其实这里的sort
意义不大,因为相对于<algorithm>
中的sort
效率低(list
中的sort
底层使用的是归并,<algorithm>
中的sort
使用的是快排)
而唯一的意义是:方便,数据量小了可以拍,但是数据量再大,就不要使用list
中的sort
了
如果想要排序,完全可以把list
中的数据拷贝到vector
中,然后排vector
,排序完之后再把数据拷贝会list
中
void test5()
{list<int> lt{ 5,7,3,9,1,0,4,7,8,9,4, };vector<int> v;//将数据从list拷贝到vectorfor (auto e : lt){v.push_back(e);}//在vector中排序reverse(v.begin(), v.end());//再把数据从vector拷贝到list中for (auto e : v){lt.push_back(e);}
}
unique
void unique();
作用是去重,但是需要先排序
void test6()
{list<int> lt{2,6,5,2,2,2,2};lt.sort();lt.unique();// 5,6
}
remove
void remove (const value_type& val);
remove的作用是先找到所有val
的位置,然后erase
掉所有的val
void test6()
{list<int> lt{1,2,3,4,5,6,6,7,8};//移除元素6lt.remove(6);//1,2,3,4,5,7,8
}
splice
void splice (iterator position, list& x);void splice (iterator position, list& x, iterator i);void splice (iterator position, list& x, iterator first, iterator last);
splice的作用是转移节点
void splice (iterator position, list& x)
,将x
链表中的所有元素转移到position
位置void splice (iterator position, list& x, iterator i)
,将x
链表中i
位置的元素转移到position
位置void splice (iterator position, list& x, iterator first, iterator last)
,将x
链表中[first,last)中的元素转移到position
位置
void test7()
{list<int> lt1{ 1,2,3,4,5,6,7 };list<int> lt2{ 0,0 };lt2.splice(++lt2.begin(), lt1);for (auto e : lt1){cout << e << " ";}//lt1中的元素转移空了cout << endl;for (auto e : lt2){cout << e << " ";}//0 1 2 3 4 5 6 7 0cout << endl;list<int> lt3{ 1,2,3,4,5,6,7 };list<int> lt4{ 0,0 };lt4.splice(++lt4.begin(), lt3, ++lt3.begin());for (auto e : lt3){cout << e << " ";}//1 3 4 5 6 7cout << endl;for (auto e : lt4){cout << e << " ";}//0 2 0cout << endl;list<int> lt5{ 1,2,3,4,5,6,7 };list<int> lt6{ 0,0 };lt6.splice(++lt6.begin(), lt5,++++lt5.begin(), --lt5.end());for (auto e : lt5){cout << e << " ";}//1 2 7cout << endl;for (auto e : lt6){cout << e << " ";}//0 3 4 5 6 0cout << endl;
}
相关文章:

STL list基本用法
目录 list的使用构造函数和赋值重载迭代器(最重要)容量相关插入删除元素操作reversesortuniqueremovesplice list的底层实际是双向链表结构 list的使用 构造函数和赋值重载 构造函数说明list()无参构造list (size_type n, const value_type& val value_type())构造的li…...

【ArcGIS微课1000例】0073:ArcGIS探索性回归分析案例
一、探索性回归工具简介 “探索性回归”工具会对输入的候选解释变量的所有可能组合进行评估,以便根据用户所指定的指标来查找能够最好地对因变量做出解释的 OLS 模型。 给定一组候选解释变量,找出正确指定的 OLS 模型: 用法: 工具还会生成一个可选表,该表包括所有满足…...

docker使用安装教程
docker使用安装教程 一、docker安装及下载二、使用教程2.1 镜像2.2 容器2.3 docker安装Redis 一、docker安装及下载 一、安装 安装执行命令:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 二、启停常用命令 启动docker,执行命令…...

【SpringSecurity】五、UserDetails接口和UserDetailsService接口
文章目录 1、SpringSecurity原理2、UserDetails接口3、UserDetailService接口4、权限配置 1、SpringSecurity原理 Spring Security是做安全访问控制,对所有进入系统的请求进行拦截,并做校验,这可以通过Filter或者AOP实现,Spring …...

了解ET模式和LT模式:Linux网络编程中的事件触发方式
文章目录 概述摘要正文:介绍ET模式(边缘触发)LT模式(水平触发 默认) 总结 概述 当谈到Linux网络编程中的ET(边缘触发)模式和LT(水平触发)模式时,我们需要理解它们在事件…...

内部类和匿名类
目录 一、内部类 1.数据访问 2.静态内部类 二、内部类和外部类区别 1.访问修饰符: 2.static修饰: 3.使用: 三、匿名类 PS:小练习 一、内部类 内部类是指将一个类定义在另一个里面。 内部类分为static内部类和普通内部类。 public…...

RISC-V 中国峰会 | OpenMPL引人注目,RISC-V Summit China 2023圆满落幕
RISC-V中国峰会圆满落幕 2023年8月25日,为期三天的RISC-V中国峰会(RISC-V Summit China 2023)圆满落幕。本届峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新…...

时空数据挖掘精选23篇论文解析【AAAI 2023】
今天和大家分享时空数据挖掘方向的资料。 时空数据挖掘是人工智能技术的重要分支,是一种采用人工智能和大数据技术对城市时空数据进行分析与挖掘的方法,旨在挖掘时空数据,理解城市本质,解决城市问题。 目前,时空数据…...

MySQL 存储过程和函数
目录 一、存储过程和函数概述 二、创建存储过程和函数 1、创建存储过程 2、创建存储函数 三、查看/调用储存过程和函数 1、查看储存过程/函数 2、调用储存过程/函数 四、修改/删除存储过程和函数 1、修改存储过程和函数 2、删除存储过程和函数 五、练习 一、存储过…...

ClickHouse 使用
CREATE DATABASE test on cluster ck_00_1repl; DROP TABLE local_t_ordt_order on cluster ck_00_1repl; 创建本地 local 表 CREATE TABLE test.local_order_db_t_order on cluster ck_00_1repl ( forder_id_hash String, forder_id String, fuid Int32, forder_type Int32…...

通过SSH协议连接远程服务器(Linux)
能够连接远程服务器的软件有很多,例如MobaXterm、Xshell、PuTTY、SecureCRT等。 以下是在Windows系统上通过SSH协议来连接Linux系统的操作过程: 在Linux系统上打开终端,输入ifconfig命令查看主机名;如果无法执行该命令ÿ…...

IPC之System V vs POSIX
文章目录 IPC示例共享内存POSIX shmSystem V shm IPC 当谈到IPC(Inter-Process Communication,进程间通信)时,它是指不同进程之间进行数据交换和通信的机制。 它允许在操作系统中运行的不同进程之间传输数据,这些进程…...

视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

分布式定时任务
分布式定时任务 背景xxl-job实战代码背景 在大多数业务场景中,非及时的数据同步,或者数据处理,都需要定时任务来处理 xxl-job 选型1.社区活跃度与文档完整度高 2.发迅速、学习简单、轻量级、易扩展 3.功能支持多 4.使用该框架的公司多,现登记有600多家公司已经应用该框架…...

国标GB28181视频平台EasyGBS视频监控平台无法播放,抓包返回ICMP排查过程
国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台,可实现的视频功能包括:实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强,支持将…...

计算机毕设 基于深度学习的图像超分辨率重建 - opencv python cnn
文章目录 0 前言1 什么是图像超分辨率重建2 应用场景3 实现方法4 SRResNet算法原理5 SRCNN设计思路6 代码实现6.1 代码结构组织6.2 train_srresnet6.3 训练效果 7 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少…...

基于Java+SpringBoot+Vue前后端分离科研工作量管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

Java复习-17-Object类
Object 类 功能:可以解决参数的统一问题特点:Java中所有的类型都是 Object 类的子类(包括自定义的类)。运用:如果一个程序的方法要求可以接收所有类的对象的时候就可以利用 Object 实现处理。 toString() 方法 可以…...

数据结构--树4.2.4(树、森林即二叉树的相互转换(仅供参考))
目录 一、树转换成二叉树步骤 二、森林转换成二叉树 三、二叉树到树、森林的转换 一、树转换成二叉树步骤 分两个步骤: 1、在树中所有的兄弟结点之间加一连线。 2、对每个结点,除了保留与其长子(最左边)的连线外,去…...

MyBatis-Plus 总结
MyBatis-Plus简介 官网:https://baomidou.com/ GitHub:https://github.com/baomidou/mybatis-plus Gitee:https://gitee.com/baomidou/mybatis-plus 简介 MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具&#x…...

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )
代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…...

leetcode做题笔记111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路一:递归 int minDepth(struct TreeNode* root){if(!root)return 0;int leftminDepth(root->le…...

ubuntu安装Google Chrome 浏览器和ChromeDriver
要在Ubuntu上安装Google Chrome浏览器和ChromeDriver,可以按照以下步骤操作: 1. 安装Google Chrome 浏览器 下载Google Chrome 的最新版本。 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb使用dpkg安装下载的deb包。…...

猫头虎博主赠书一期:《Kubernetes原生微服务开发》
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

QtC++ 设计模式(四)——策略模式
策略模式 序言理解源码 序言 还是参考的菜鸟教程,会C的还是看C的方式来得舒服。 . 理解 使用符合UML规范的便于理解和回忆,接口其实就是普通的基类 . 源码 strategy.h /// 策略 class Strategy { public:virtual ~Strategy();/*** brief 计算* p…...

LVS集群和分布式概念
LVS 一.集群和分布式概念 1.1 集群 在计算机领域,集群早在 1960 年就出现,随着互联网和计算机相关技术的发展,现在 集群这一技术已经在各大互联网公司普及。 1.1.1 集群概念 计算机集群指一组通过计算机网络连接的计算机,它们…...

javafx应用程序线程异常Exception in thread “JavaFx Application Thread“
前几天用javafx做小桌面应用程序出现了一个问题: 反复检查,最终确定报错的原因是UI刷新频率过快导致的 javafx提供了Platform.runLater用于解决该问题: Platform.runLater(new Runnable() {Overridepublic void run(){//用Platform.runLate…...

大漠插件7.2336
工具名称:大漠插件7.2336 更新时间2023-08-28更新内容/v7.23361. YOLO综合工具标记逻辑优化. 更加的方便2. YOLO综合工具增加了默认类. 对于多个同类可以不用每次都进行选择.3. YOLO综合工具增加可以对模型的输入大小进行修改4. YOLO的dmx格式变更.新老版本不混用. 新的dmx格式…...

5年测试,面试结束后被HR发朋友圈怼了..(心塞)
前一阵子向朋友诉苦,我在参加字节跳动面试的时候被面试官怼得哑口无言,场面让我一度十分尴尬。 印象最深的就是下面几个问题: 根据你以前的工作经验和学习到的测试技术,说说你对质量保证的理解? 非关系型数据库和关系型…...

基于相空间重构的混沌背景下微弱信号检测算法matlab仿真,对比SVM,PSO-SVM以及GA-PSO-SVM
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 SVM 4.2 PSO-SVM 4.3 GA-PSO-SVM 5.算法完整程序工程 1.算法运行效果图预览 SVM: PSO-SVM: GA-PSO-SVM: 以上仿真图参考文献《基于相空间重构的混沌背景下微弱信号检测方法研究》 2.…...