[C++随笔录] list使用

list使用

  • 构造函数
  • insert && 迭代器
  • push_back && pop_back && push_front && pop_front
  • erase
  • sort && find && reverse

list的底层结构就是 带头双向循环链表

构造函数

// 默认构造
list<int> lt;
cout << "lt->";
for (auto it : lt)
{cout << it << " ";
}
cout << endl;// 用n个val来进行初始化
list<int> lt1(10);
cout << "lt1->";
for (auto it : lt1)
{cout << it << " ";
}
cout << endl;list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{cout << it << " ";
}
cout << endl;// 迭代器区间进行初始化
list<int> lt3(lt2.begin(), lt2.end());
cout << "lt3->";
for (auto it : lt3)
{cout << it << " ";
}
cout << endl;// 拷贝构造
list<int>lt4 = lt3;
cout << "lt4->";
for (auto it : lt4)
{cout << it << " ";
}
cout << endl;

运行结果:

lt->
lt1->0 0 0 0 0 0 0 0 0 0
lt2->1 1 1 1 1 1 1 1 1 1
lt3->1 1 1 1 1 1 1 1 1 1
lt4->1 1 1 1 1 1 1 1 1 1

insert && 迭代器



看来list并没有 重载 + 运算符
但是重载了++


list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;cout << "插入->";
lt2.insert(lt2.begin()++, 10);
for (auto it : lt2)
{cout << it << " ";
}
cout << endl;

运行结果:

lt2->1 1 1 1 1 1 1 1 1 1
插入->10 1 1 1 1 1 1 1 1 1 1

如果, 我们想要在 第五个位置进行插入该怎么办?

list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;// 先找到下标为5的迭代器
auto it = lt2.begin();
for (int i = 0; i < 5; i++)
{++it;
}list<int>::iterator c = lt2.insert(it, 50);
cout << "插入->";
for (auto it : lt2)
{cout << it << " ";
}
cout << endl;cout << "insert返回值的解引用->" << * c << endl;

运行结果:

lt2->1 1 1 1 1 1 1 1 1 1
插入->1 1 1 1 1 50 1 1 1 1 1
insert返回值的解引用->50

list迭代器遍历时,while循环的判断条件只能是!=,不能是<

list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;// 迭代器遍历
list<int>::iterator it = lt2.begin();
cout << "迭代器遍历->";
while (it != lt2.end())
{cout << *it << " ";++it;
}
cout << endl;

运行结果:

lt2->1 1 1 1 1 1 1 1 1 1
迭代器遍历->1 1 1 1 1 1 1 1 1 1

push_back && pop_back && push_front && pop_front

	list<int> lt2(5, 1);cout << "lt2->";for (auto it : lt2){cout << it << " ";}cout << endl;lt2.pop_back();lt2.pop_back();lt2.pop_back();lt2.pop_back();cout << "尾删->";for (auto it : lt2){cout << it << " ";}cout << endl;lt2.push_back(13);lt2.push_back(30);lt2.push_back(45);lt2.push_back(6);lt2.push_back(60);lt2.push_back(5);lt2.push_back(7);cout << "尾插->";for (auto it : lt2){cout << it << " ";}cout << endl;lt2.pop_front();lt2.pop_front();lt2.pop_front();lt2.pop_front();lt2.pop_front();cout << "头删->";for (auto it : lt2){cout << it << " ";}cout << endl;lt2.push_front(25);lt2.push_front(55);lt2.push_front(9);lt2.push_front(6);lt2.push_front(20);cout << "头插->";for (auto it : lt2){cout << it << " ";}cout << endl;

运行结果:

lt2->1 1 1 1 1
尾删->1
尾插->1 13 30 45 6 60 5 7
头删->60 5 7
头插->20 6 9 55 25 60 5 7

erase

// 删除lt2中的所有奇数
auto it = lt2.begin();
while (it != lt2.end())
{if ((*it) % 2 == 1){// erase返回删除后的下一个节点的地址 -- 更新了itit = lt2.erase(it); }
else{// 不是奇数, 那就++it++;}
}
cout << "删除所有奇数->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;

运行结果:

lt2->1 1 1 1 1 1 13 30 45 6
删除所有奇数->30 6

但是我们需要注意: erase的形参是不能再使用的, 切记!切记!

sort && find && reverse

当我们调用 算法库中的sort:


🗨️这是怎么一回事?

  • 其实, 迭代器可以按照性质(有底层结构决定)来进行划分:
    单向迭代器 – – 可以进行 ++
    比如: forward_list/ unordered_map/ unordered_set
    双向迭代器 – – 可以进行 ++/ –
    比如: list/ map/ set
    随机迭代器 – – 可以进行+/ - / ++/ –
    比如: vector/ deque/ string


但是std::sort的迭代器使用的是 随机迭代器类型 ⇒ 故 list不能使用算法库中的sort算法

但list类中自带sort算法👇👇👇

//sort(lt2.begin(), lt2.end());
lt2.sort();
cout << "升序->";
for (auto e : lt2)
{cout << e << " ";
}
cout << endl;lt2.sort(greater<int>());
cout << "降序->";
for (auto e : lt2)
{cout << e << " ";
}
cout << endl;

运行结果:

升序->1 5 6 7 13 30 45 60
降序->60 45 30 13 7 6 5 1

温馨提示:

list自带的排序很慢的, 小数据量(<10万)的可以用用,
但大数据量还不如 将数据拷贝到vector中, vector排好序之后, 再将结果拷贝回去快
使用好 对应的容器, 对效率来说很重要的

find函数list并没有, 但是可以用算法库中的

list函数自带reverse函数, 但其实还不如用库里的


学须反己。若徒责人,只见得人不是,不见自己非。若能反己,方见自己有许多未尽处,奚暇责人? — — 王阳明
译: 有位朋友经常因为生气而指责别人。王阳明告诫他说:“学习应该反身自省。如果只去指责别人,就只能看到别人的错误,就不会看到自己的缺点。若能返身自省,才能看到自己有许多不足之处,哪还有时间去指责别人?
舜的弟弟叫象,象屡次想害死舜,但舜还是照样疼他。王阳明说,舜之所以能感化象的傲慢,最主要的就是舜不去看象的不是。如果舜坚决要去纠正象的奸恶,只会看到象的不是,而象又是一个傲慢的人,肯定不会认错,舜又岂能感化他?” 这位朋友听了这番话,甚感惭愧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SolidJs节点级响应性

前言 随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流&#xff0c;相关的技术框架大行其道&#xff0c;就以目前主流的Vue、React框架来说&#xff0c;它们都基于组件化、响应式、虚拟DOM等技术思想的实现&#xff0c;但是具有不同开发使用方式以及实现原理&#…

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件&#xff1a;失败条件&#xff1a;解决方法:清除cooKie 滑动验证方式一&#xff1a;win32 api获取窗口句柄&#xff0c;选择固定位置 成功率高方式二&#xff1a; 原自动化滑动&#xff0c;成功率中 案例 先谈理论&#xff0c;淘宝 taobao.com …

ChatGPT详细搭建教程+支持AI绘画

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

人才测评系统在企业招聘中的应用

人才测评作为招聘工具&#xff0c;已经频繁应用在各大企业中&#xff0c;如今的社会中&#xff0c;人才对于企业而言&#xff0c;可谓是创造产值的基础。换句话说&#xff0c;”企业得人才者、才能得天下”&#xff0c;有了人才之后&#xff0c;企业在行业中才有竞争力。 目前…

ES修改字段的数据类型

-- mysql修改字段数据类型语句 ALTER TABLE 表名 MODIFY COLUMN 列名 修改的字段类型;-- hive 修改字段数据类型语句 ALTER TABLE 表名 CHANGE COLUMN 列名 修改的字段类型;--es修改字段数据类型语句无法通过一个语句进行修改。思路&#xff1a; 1、对修改字段重新建修改类型的…

【Redis】Redis做为缓存,MySQL如何与Redis保持数据一致

Redis的作用 一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层&#xff0c;主要目的是减少数据库的io&#xff0c;还可以提升数据库io性能 方法一&#xff1a; 先更新MySQL数据库&#xff0c;再删除缓存&#xff0c;再从数据库查询到的最新的数据同步到redis…

Unity实现角色受到攻击后屏幕抖动的效果

文章目录 实现效果摄像机抖动脚本 玩家受伤其他文章 实现效果 首先看一下实现效果。 摄像机 我们要使用屏幕抖动&#xff0c;使用的是CinemachineVirtualCamera这个组件&#xff0c;这个组件需要在包管理器中进行导入。 导入这个组件之后&#xff0c;创建一个Chinemachine-…

CH2--x86系统架构概览

2.1 OVERVIEW OF THE SYSTEM-LEVEL ARCHITECTURE 图中的实线箭头表示线性地址&#xff0c;虚线表示段选择器&#xff0c;虚线箭头表示物理地址 2.1.1 Global and Local Descriptor Tables 全局描述符表 (GDT) GDT是一个全局的段描述符表&#xff0c;它存储在系统内存中的一个固…

MYSQL逻辑架构

文章目录 MYSQL逻辑架构1. 逻辑架构剖析1.1.1 MYSQL的逻辑架构---三层1.1.2 连接层---第一层1.1.3 服务层---第二层1.1.4 引擎层---第三层 2 服务器处理客户端请求---三部分3. SQL执行流程3.0 SQL语法顺序3.1 MYSQL中的SQL执行流程3.1.1 查询缓存3.1.2. 解析器3.1.3. 优化器3.1…

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性&#xff1f;二、虹科的测试仿真工具如何在汽车零部件测试展露头角&#xff1f;三、应用场景**应用场景1&#xff1a;方向盘开关的功能测试****应用场景2&#xff1a;各类型电机的控制测试****应用场景3&#xff1a;RGB氛围灯的功能测试…

详解MySQL索引+面试题

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、索引概述…

芯片SoC设计你了解吗?

数字IC设计根据岗位性质一般包含SOC设计&#xff0c;前端设计&#xff0c;ASIC设计&#xff0c;逻辑设计&#xff0c;IP设计&#xff0c;CPU设计等。 有人说&#xff1a;做IP设计就是翻译官&#xff0c;做SOC设计就是连连看。 SoC设计是做什么的&#xff1f;与IP设计有什么不同…

docker系列(7) - Dockerfile

文章目录 7. Dockerfile7.1 Dockerfile介绍7.2 指令规则7.3 指令说明7.3.1 RUN命令的两种格式7.3.1 CMD命令覆盖问题7.3.2 ENTRYPOINT命令使用7.3.3 ENV的使用 7.4 构建tomcat Dockerfile案例7.4.1 准备原始文件7.4.2 编写Dockerfile7.4.3 构建镜像7.4.4 验证镜像 7.5 构建jdk基…

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…

springboot实战(七)之jackson配置前后端交互下划线转驼峰对象序列化与反序列化

目录 环境&#xff1a; 1.驼峰转下划线配置 1.1单个字段命名转化使用JsonProperty注解 1.2单个类进行命名转化 3.全局命名策略配置 2. 序列化以及反序列化 2.1序列化 2.2反序列化 3.自定义序列化与反序列化 在Web开发中&#xff0c;JSON&#xff08;JavaScript Obje…

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 - cpolar内网穿透

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

数据结构题型10-链栈

//参考博客&#xff1a;https://blog.csdn.net/weixin_37716512/article/details/104068102 #include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 10 #define ERROR 0 #define OK 1typedef struct Linknode {Elemtype data;…

DS18B20温度传感器

DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线&#xff08;单总线&#xff09;”接口的温度传感器 这种一线总线就是 三线制 SPI DS18B20的 配置寄存器&#xff1a; TM 是测试位&#xff0c;出厂设置就被设置为0&#xff0c;不需要改动&#xff0c; R1、R…

企业架构LNMP学习笔记61

Nginx作为tomcat的前段反向代理&#xff1a; 在实际业务环境中&#xff0c;用户是直接通过域名访问&#xff0c;基于协议一般是http、https等。默认tomcat运行在8080端口。一般会通过前端服务器反向代理到后端的tomcat的方式&#xff0c;来实现用户可以通过域名访问tomcat的we…

微信收款码费率0.38太坑了

作为一个有多年运营经验的商家&#xff0c;我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司&#xff0c;但了解到的收款手续费率通常都在0.6左右&#xff0c;最低也只能降到0.38。这个过程吃过不少苦头。毕竟&#xff0c;收款功能是我们商家的命脉&…