C++ —— 关于list

目录

链接

前言

1. 迭代器浅解

2. 接口

2.1 构造函数 

 2.2 push_back

2.3 emplace_back

2.4 insert

 2.5 erase 

 2.6 reverse 

2.7 sort

2.8 merge

 2.9 unique

 2.10 splice


链接

cplusplus.com/reference/list/list/?kw=listicon-default.png?t=O83Ahttps://cplusplus.com/reference/list/list/?kw=list


前言

list的结构其实就是一个 "带头双向循环链表",与string和vector相比,list不支持下标+[]的访问,因为链表是由一个节点一个节点连接而成的,空间并不是连续的


 

1. 迭代器浅解

 

不同性质的迭代器所支持的功能也不同,这是因为底层结构所决定的 

 如果我们使用不匹配的迭代器就会出错,比如sort就只能使用随机迭代器,因为其底层函数需要进行 - 的操作,如果是其它迭代器就会报错

list<int> lt(5, 1);
//错误,sort函数的底层要求使用随机迭代器类型
sort(lt.begin(), lt.end());

 


2. 接口

2.1 构造函数 

//n个val构造
list<int> lt(5, 1);//迭代器遍历
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}
cout << endl;//范围for遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;


 2.2 push_back

push_back只能尾插单个数据,无法直接插入(3,3)这样类型的函数

//n个val构造
list<int> lt(5, 1);lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);//迭代器遍历
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}

 

list<A> lt;A aa1(1, 1);lt.push_back(aa1);//匿名对象lt.push_back(A(2,2));//报错//lt.push_back(3, 3);

 


2.3 emplace_back

也是尾插函数,但是emplace_back可以直接插入(3,3)这样的数据

void test_list2()
{list<A> lt;A aa1(1, 1);lt.push_back(aa1);lt.push_back(A(2,2));//lt.push_back(3, 3);lt.emplace_back(aa1);lt.emplace_back(A(2,2));cout << endl;// 支持直接传构造A对象的参数emplace_backlt.emplace_back(3, 3);
}

2.4 insert

在指定位置之前插入数据,list中insert使用的是双向迭代器,不是随机迭代器,那么就不能向以前一样使用 

//不支持这样
lt.insert(it.begin()+3,30);
list<int> lt(5, 1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);lt.insert(lt.begin(), 10);//在首位前插入数据//在第k个位置之前插入数据
auto it = lt.begin();
int k = 3;
while (k--)
{it++;
}
lt.insert(it, 30);//迭代器遍历
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}
cout << endl;
//范围for遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

 


 2.5 erase 

删除指定位置数据

 list<int> lt(5, 1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);int x = 0;cin >> x;auto it = find(lt.begin(), lt.end(), x);//如果find没有找到就会返回第二个参数也就是lt.end()while (it != lt.end()){lt.erase(it);}//迭代器遍历
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}
cout << endl;
//范围for遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

 


 2.6 reverse 

逆置

list<int> lt(5, 1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);lt.reverse();//迭代器遍历
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}
cout << endl;
//范围for遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

 


2.7 sort

因为算法库中的sort函数不支持链表,所以链表自实现了一个sort函数来进行排序,默认是升序  

如果要降序的话可以使用仿函数来进行降序的调整:

1. lt.sort(greater<int>())         2. lt.sort(less<int>())

list<int> lt(5, 1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);lt.sort();//迭代器遍历
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}
cout << endl;
//范围for遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;


2.8 merge

merge的作用是将两个有序链表进行合并,合并的前提是有序的

合并计算将second链表合并到first链表,那么second链表就会置空,其合并的原理就是取小的尾插到被合并链表

list<int> first;
first.push_back(1);
first.push_back(2);
first.push_back(3);
first.push_back(4);list<int> second;
second.push_back(10);
second.push_back(20);
second.push_back(30);
second.push_back(40);first.merge(second);
//范围for遍历
for (auto e : first)
{cout << e << " ";
}
cout << endl;
//范围for遍历
for (auto e : second)
{cout << e << " ";
}
cout << endl;

 

 


 2.9 unique

有序的数据去掉重复的数据

 

list<int> lt(5, 1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);//范围for遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;lt.unique();//范围for遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;


 2.10 splice

剪切

将链表指定的数据剪切到被粘贴的链表中去,被剪切链表中被剪切的数据会直接删除,也可以对自身进行操作,即变化自身链表数据的顺序

void test_list6()
{// 一个链表节点转移给另一个链表std::list<int> mylist1, mylist2;std::list<int>::iterator it;// set some initial values:for (int i = 1; i <= 4; ++i)mylist1.push_back(i);      // mylist1: 1 2 3 4for (int i = 1; i <= 3; ++i)mylist2.push_back(i * 10);   // mylist2: 10 20 30it = mylist1.begin();++it;                         // points to 2mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4// mylist2 (empty)// "it" still points to 2 (the 5th element// 调整当前链表节点的顺序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);for (auto e : lt){cout << e << " ";}cout << endl;int x = 0;cin >> x;it = find(lt.begin(), lt.end(), x);if (it != lt.end()){//lt.splice(lt.begin(), lt, it);lt.splice(lt.begin(), lt, it, lt.end());}for (auto e : lt){cout << e << " ";}cout << endl;
}

 


                                                                        感谢观看~                                                                  

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

轰!天文学家刚刚目睹了三年来最大的太空爆炸

天文学家目睹了太空中最大的一次爆炸。 被标记为 AT2021lwx 的这次爆炸事件被观测到比任何已知的超新星都要亮十倍&#xff0c;超新星爆炸发生在大质量恒星死亡之时。而且超新星爆炸只持续几个月&#xff0c;而这次爆炸事件已经持续了至少三年。 AT2021lwx 也比恒星被超大质量…

[新闻]Tom Sawyer Software宣布发布SysML v2 Viewer

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 摘译自 EIN Presswire&#xff0c;2024年9月18日 Tom Sawyer SysML v2 Viewer提供自动布局和直观的图形交互&#xff0c;使工程师更容易高效地探索和分析复杂模型&#xff0c;并获得…

哪里有同等学力申硕英语历年真题答案

很多考生想知道哪里有同等学力申硕英语历年真题答案 第一官方渠道 教育部考试中心或相关学位授予单位官网&#xff1a;这些机构通常会发布考试大纲、考试指南等官方文件&#xff0c;其中可能包含历年真题。 考生可以访问这些官网&#xff0c;查找并下载相关资料&#xff0c; …

高级算法LLM大语言模型算法特训 带你转型AI大语言模型算法工程师

LLM&#xff08;大语言模型&#xff09;是指大型的语言模型&#xff0c;如GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型。以下是《LLM大语言模型算法特训&#xff0c;带你转型AI大语言模型算法工程师》课程可能包含的内容&#xff1a; 1.深入理解大…

考研数据结构——C语言实现冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的列表&#xff0c;比较每对相邻元素&#xff0c;并在顺序错误的情况下交换它们。这个过程重复进行&#xff0c;直到没有需要交换的元素&#xff0c;这意味着列表已经排序完成。冒泡排序的名字来源于较小的元素会逐…

面试中这样介绍自己的项目经验,轻松拿Offer!

面试时7分靠能力&#xff0c;3分靠技能&#xff0c;而刚开始时的介绍项目又是技能中的重中之重&#xff0c;所以本文将从“介绍”和“引导”两大层面告诉大家如何准备面试时的项目介绍。 在面试时&#xff0c;经过寒暄后&#xff0c;一般面试官会让介绍项目经验 。常见的问法是…

点云与Open3D入门

文章目录 点云数据介绍点云 Open3D点云基础操作RGBD转换为PCDPLY转PCD 点云空间搜索K-DTree原理搜索算法 OCTree 点云滤波体素下采样点云体素化复杂点云体素化统计滤波半径滤波 点云特征提取法线估计 点云分割DBSCAN 聚类分割&#xff08;运行时间较长&#xff09;PANSNC平面分…

给pycharm项目设置conda环境新

创建虚拟环境 conda create -n llama python3.11 激活虚拟环境 conda activate llama 设置Pycharm环境

基于Spring Boot的宠物咖啡馆平台【附源码】

基于Spring Boot的宠物咖啡馆平台&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 …

CASS的拉伸命令

1、打开CASS软件&#xff0c;绘制一个矩形框 2、在右侧【修改】工具条中&#xff0c;选择【拉伸】按钮 3、 框选需要拉伸对象&#xff0c;注意是框选不是点选&#xff0c;点选的话无法拉伸图形 这个也是注明了&#xff0c;以交叉窗口或多边形框选对象 4、拉伸结果

基于STM32的电压检测WIFI模拟

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32单片机&#xff0c;通过滑动变阻器模拟电压传感器检测电压&#xff0c;通过12864显示显示电压和电压阈值&#xff0c;按键可以控制阈值的增加&#xff0c;并通过串口实时显示相关参数和状…

新零售社交电商系统的卷轴模式开发:重塑消费体验与商业生态

随着互联网的飞速发展&#xff0c;新零售与社交电商的深度融合已成为电商行业的新趋势。在这一背景下&#xff0c;“卷轴模式”作为一种创新性的商业模式&#xff0c;正逐步被引入到新零售社交电商系统的开发中&#xff0c;旨在通过更加灵活、互动性强的购物体验&#xff0c;吸…

[python-pdal]python-pdal安装后测试代码

测试代码&#xff1a; import pdal import tiledbdata "1.2-with-color.las"pipeline pdal.Reader.las(filenamedata).pipeline() print(pipeline.execute()) # 1065 points# Get the data from the first array # [array([(637012.24, 849028.31, 431.66, 143, …

双端搭建个人博客

1. 准备工作 确保你的两个虚拟机都安装了以下软件: 虚拟机1(Web服务器): Apache2, PHP虚拟机2(数据库服务器): MariaDB2. 安装步骤 虚拟机1(Web服务器) 安装Apache2和PHP 更新系统包列表: sudo apt update安装Apache2: sudo apt install apache2 -y安装PHP及其Apac…

视频汇聚/视频存储/安防视频监控EasyCVR平台RTMP推流显示离线是什么原因?

视频汇聚/视频存储/安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 EasyCVR安防监控视频综合管理平台采用先进的网络传输技术&#xff0…

[Redis][Zset]详细讲解

目录 0.前言1.常见命令1.ZADD2.ZCARD3.ZCOUNT4.ZRANGE5.ZREVRANGE6.ZRANGEBYSCORE7.ZPOPMAX8.BZPOPMAX9.ZPOPMIN10.BZPOPMIN11.ZRANK12.ZREVRANK13.ZSCORE14.ZREM15.ZREMRANGEBYRANK16.ZREMRANGEBYSCORE17.ZINCRBY 2.集合间操作1.有序集合的交集操作2.ZINTERSTORE3.有序集合的并…

网络战时代的端点安全演变

​ 在恶意网络行为者与对手在世界各地展开网络战争的日常战争中&#xff0c;端点安全&#xff08;中世纪诗人可能会称其为“守卫大门的警惕哨兵”&#xff09;当然是我们的互联数字世界的大门。 端点安全类似于我们今天称之为现代企业的数字有机体的免疫系统&#xff0c;可以将…

线性回归与最小二乘法

线性回归是统计学中的概念&#xff0c;以其建模速度快&#xff0c;不需要很复杂的计算并且模型解释性强等优点在机器学习中广泛应用。线性回归模型主要用于数据预测&#xff0c;其模型参数常用最小二乘法获得。 一、模型&#xff1a; 最开始人们得到了很多组带有测量误差的数…

JS中的事件和DOM操作

一、事件[重要] 1、 事件介绍 事件: 就是发生在浏览器(页面)上一件事,键盘事件,鼠标事件,表单事件,加载事件等等 2、 事件绑定方式 事件要想发生,就得将事件和标签先绑定(确定哪个标签发生什么事情,又有什么响应) 一个完整的事件有三部分 事件源(标签),哪里发出的事. 什么事(…

SAM核心代码注释总结

最近看sam2&#xff0c;顺便注释了下代码&#xff0c;方便回顾和分享。 PS: tensor的维度都基于默认参数配置。 SAM _build_sam sam模块包含三个部分&#xff0c;ImageEncoderViT、PromptEncoder和MaskDecoder&#xff1a; def _build_sam(encoder_embed_dim,encoder_depth…