本篇我们将学习STL中list的使用

目录

list的初始和官方文档

list的官方文档

 list的构造与析构

        构造函数

        析构函数

        =运算符重载 

迭代器

        正向迭代器

        反向迭代器

        const正向迭代器

        const反向迭代器

容量

        empty

        size

        max_size

访问

         访问第一个元素​编辑

        访问最后一个元素 

修饰符函数

        头插

        尾插 

        构造并头插

        构造并尾插

        assign

        头删

        尾删

        emplace

        insert

        erase

        resize

        swap

        clear

操作

        sort

        reverse

        归并​编辑

        unique

        remove 

        remove_if

        splice(拼接)

获取分配器(后续深入学习)

非成员函数重载

        关系运算符重载

        swap​编辑


list的初始和官方文档

        list在底层上类似于双向循环链表

        在使用list之前需要包含头文件<list>并且有

using namespace std;

list的官方文档

list - C++ 参考

std::list - cppreference.com

 list的构造与析构

        构造函数

void list_test1()
{list<int>lt1;//默认构造函数,创建一个空的listlist<int>lt2(10,1);//使用10个1初始化list//构造类似于vector的用法vector<int>v1={1,2,3,4,5};//迭代器区间构造list<int>lt3(v1.begin(),v1.end());//使用vector初始化list//传递数组的指针int a[] = {1,2,3,4,5};list<int>lt4(a,a+4);
}

        指针是一种特殊的迭代器(指针是指向数组的指针)。

        迭代器行为本质上就是模拟指向数组的指针

        容器的迭代器按功能分为三种:

        通用功能:++,*,!=

        单向:只支持++(单链表/哈希表)

        双向:除了支持++,还支持--(红黑树/双向链表list)

        随机:除了支持++,还支持--、+、-(string/vector/deque)

        迭代器类型可以从这个位置看到

        一个算法不是所有的容器都适用的,算法对迭代器有一定的要求。

        下图所示的情况下,sort没办法对list类型进行排序,没有对应的功能去支持

        双向迭代器是特殊的单向迭代器,随机迭代器是特殊的双向迭代器。

                        

        所以要求传双向迭代器的时候可以传双向迭代器也可以传随机迭代器

        析构函数

        =运算符重载 

迭代器

        正向迭代器

        反向迭代器

        const正向迭代器

 

        const反向迭代器

容量

        empty

        size

        max_size

        理论值,实际意义不大

访问

         访问第一个元素

        访问最后一个元素 

修饰符函数

        头插

        尾插 

        测试: 

void list_test2()
{list<int>lt1(5,1);for (auto e : lt1){cout << e << " ";}cout << endl;lt1.push_back(2);//在list尾部添加元素lt1.push_front(3);//在list头部添加元素for (auto e : lt1){cout << e << " ";}cout << endl;
}

结果:

        构造并头插

        构造并尾插

        assign

        头删

        尾删

        emplace

        insert

        erase

        resize

 

测试:

void list_test3()
{list<int>lt1(5, 1);for (auto e : lt1){cout << e << " ";}cout << endl;lt1.resize(20, 5);for (auto e : lt1){cout << e << " ";}cout << endl;lt1.resize(2,0);for (auto e : lt1){cout << e << " ";}cout << endl;
}

结果为:

        swap

        clear

操作

        sort

        算法库的sort是随机迭代器,不适合list

        但是sort的效率比算法库的sort要低,为什么呢?

        在内存上,分配内存的时候除了CPU还有三级缓存。

        CPU访问修改内存数据的时候,会看它在不在缓存,如果在就是命中,不在就是不命中。如果不在就先加载到缓存在命中。 

        CPU高速,缓存命中率高

        数组类型的命中率比较高。而链表的命中率比较低,而且有缓存污染的问题。

        sort在数据量小的时候可以使用。在实际应用中最好是用vector的 sort,如果一定要使用建议拷贝到vector然后sort返回list。

        reverse

测试:

void list_test7()
{list<int>lt1;for (int i = 1;i <= 10;i++){lt1.push_back(i);}for (auto e : lt1){cout << e << " ";}cout << endl;lt1.reverse();for (auto e : lt1){cout << e << " ";}cout << endl;
}

结果为:

 

        归并

         归并之前必须要对链表中的元素进行排序,否则会出问题

void list_test4()
{list<int>lt1,lt2;lt1.push_back(1);lt1.push_back(2);lt1.push_back(4);lt1.push_back(5);lt1.push_back(1);lt1.push_back(3);lt2.push_back(5);lt2.push_back(1);lt2.push_back(3);lt2.push_back(8);lt2.push_back(21);//归并之前必须要对数据进行排序lt1.sort();lt2.sort();//合并两个listlt1.merge(lt2);for (auto e : lt1){cout << e << " ";}cout << endl;
}

结果:

 

        unique

        作用是去重。将重复的元素去除 。但是要求必须要先排序才能使用

void list_test5()
{list<int>lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(4);lt1.push_back(5);lt1.push_back(1);lt1.push_back(3);lt1.push_back(5);lt1.push_back(8);lt1.push_back(21);lt1.sort();for (auto e : lt1){cout << e << " ";}cout << endl;lt1.unique();for (auto e : lt1){cout << e << " ";}cout << endl;	
}

结果为:

 

        remove 

void list_test6()
{list<int>lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(4);lt1.push_back(5);lt1.push_back(1);lt1.push_back(3);lt1.push_back(5);lt1.push_back(8);lt1.push_back(21);for (auto e : lt1){cout << e << " ";}cout << endl;lt1.remove(1);for (auto e : lt1){cout << e << " ";}cout << endl;
}

 结果:

        remove_if

        splice(拼接)

void list_test7()
{list<int>lt1,lt2;for (int i = 1;i <= 10;i++){lt1.push_back(i);}for (auto e : lt1){cout << e << " ";}cout << endl;for (int i = 1;i <= 5;i++){lt2.push_back(i*3);}for (auto e : lt2){cout << e << " ";}cout << endl;list<int>::iterator lt = lt1.begin();lt++;lt1.splice(lt, lt2);for (auto e : lt1){cout << e << " ";}cout << endl;
}

     结果为:

 

LRUcache(最近最少用的缓存)

获取分配器(后续深入学习)

非成员函数重载

        关系运算符重载

        swap

        本次的链表的内容就到这里了,感谢各位读者阅读,求一个点赞谢谢

封面图自取:

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

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

相关文章

USB服务器在证券公司虚拟化进程中的应用分析

在证券公司全面拥抱虚拟化、云化的技术浪潮中&#xff0c;一个看似微小却至关重要的环节曾长期阻碍进程&#xff1a;分散在各业务环节的银行前置机U盾、各种系统认证Ukey等物理USB安全设备的管理难题。这些承载着资金划拨、交易认证核心权限的“小钥匙”&#xff0c;在传统模式…

网闸内部架构设计:分层与微服务的生死博弈

引言 “物理隔离是网闸的命脉,而架构设计决定其生死。” 在数据安全领域,网闸(安全隔离与信息交换系统)是守护核心网络的钢铁长城。但当开发者试图将现代架构思想(如微服务)引入其内部时,却可能引发灾难性冲突。本文通过深度拆解分层架构与微服务在网闸中的适用性,揭示…

通过MaaS平台免费使用大模型API

文章目录 一、引言&#xff1a;MaaS平台——免费使用大模型API的新选择二、模型代码与限制术语详解&#xff08;一&#xff09;模型代码含义解析&#xff08;二&#xff09;模型使用限制术语缩写详解 三、5个MaaS平台详细介绍&#xff08;一&#xff09;OpenRouter&#xff08;…

进程代理单窗口单IP技术:原理、应用与实现

“在当今数字化时代&#xff0c;网络隐私保护与多账号管理需求日益增长。单窗口单IP技术通过为每个进程分配独立网络身份&#xff0c;巧妙地解决了多账号管理中的IP关联难题。从游戏多开防封到数据采集优化&#xff0c;从隐私保护到测试验证&#xff0c;这项技术的应用场景不断…

Java教程——线程池和future

Future 详解 1. Future 是什么? Future 是 Java 中的一个接口(java.util.concurrent.Future),代表异步计算的未来结果。它允许你: 提交任务后立即返回在需要时检查任务是否完成获取任务结果(完成后)取消任务2. 怎么使用 Future? 通过线程池提交任务: ExecutorServ…

洛谷P1351 [NOIP 2014 提高组] 联合权值

洛谷P1351 [NOIP 2014 提高组] 联合权值 洛谷题目传送门 题目背景 NOIP2014 提高组 D1T2 题目描述 无向连通图 G G G 有 n n n 个点&#xff0c; n − 1 n-1 n−1 条边。点从 1 1 1 到 n n n 依次编号,编号为 i i i 的点的权值为 W i W_i Wi​&#xff0c;每条边的长…

Apache Doris Profile 深度解析:从获取到分析,解锁查询性能优化密码

在 Doris 数据库中&#xff0c;高效的查询性能是数据处理的关键。当我们遇到查询缓慢、资源消耗异常等问题时&#xff0c;Doris 提供的 Profile 工具就如同一位 “性能侦探”&#xff0c;能帮我们抽丝剥茧&#xff0c;找到问题根源。今天&#xff0c;我们就来深入聊聊如何分析 …

系统架构师

硬件&#xff1a; 运算器&#xff1a;1&#xff09;算术运算 加减乘除 2&#xff09;逻辑运算并进行逻辑测试&#xff1a;与或非 组件功能&#xff1a;算术逻辑单元ALU :处理数据 实现对数据的算术运算和逻辑运算 累加寄存器AC 通用寄存器&#xff0c;alu提供工作区 暂存运算结…

Unity HDRP + Azure IoT 工业设备监控系统实例

Unity HDRP Azure IoT 工业设备监控系统实例 下面是一个完整的工业设备监控解决方案&#xff0c;结合Unity HDRP&#xff08;高清渲染管线&#xff09;的高质量可视化与Azure IoT的实时数据处理能力。 系统架构 #mermaid-svg-XJnD6acrBbtbqYHW {font-family:"trebuchet…

(超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)

数据库项目初体验&#xff1a;使用C语言连接数据库完成短地址服务&#xff08;本地运行版&#xff09; 前言&#xff1a;初学者的思考 作为一个刚初学数据库的小白并且在之前我的博客中我有尝试使用C语言写过一个短地址服务&#xff0c;但是使用C语言编写的短地址服务只有短记…

mysql基础(一)快速上手篇

连接mysql 使用命令行窗口连接mysql数据库 语法&#xff1a;mysql –h主机名 –u用户名 –p密码 说明&#xff1a;-h参数指定数据库ip&#xff0c;本地服务器可以用localhost&#xff0c;-u参数指定用户名&#xff0c;-p参数指定用户密码。 注意&#xff1a;-p和密码值之间…

IntelliJ IDEA 2025- 下载安装教程图文版详细教程(附激活码)

目录 写在前面 一、介绍 二、下载 三、安装 &#x1f3c1; 写在最后 写在前面 > &#x1f680; 初学 Java&#xff1f;或者刚开始写项目&#xff0c;不知道该选哪个 IDE&#xff1f; 本篇教程手把手教你安装 IntelliJ IDEA —— JetBrains 出品的顶级 Java 开发环境&a…

数学经济专业大学四年规划

数学经济专业结合了数学的逻辑严谨性和经济学的现实应用性&#xff0c;为学生提供了强大的数理分析能力和经济洞察力。该专业毕业生在金融科技、量化投资、商业分析等领域具有显著优势&#xff0c;尤其在数字经济时代&#xff0c;这类复合型人才的需求量持续增长。一、数学经济…

局域网打印机共享怎么设置?如何配置内网本地网络打印机给异地电脑远程连接使用打印?

打印机共享怎么设置&#xff1f;如何设置本地内网的网络打印机共享给其他网络下电脑连接打印&#xff1f;打印机设置使用以及异地使用打印都是大家比较关注的问题&#xff0c;下面详细教程中分二步&#xff0c;先讲局域网内的打印机共享&#xff0c;再进一步介绍内网打印机地址…

Rust异步爬虫实现与优化

Rust 语言在爬虫领域的应用相对较少&#xff0c;尽管 Rust 的 async/await 已稳定&#xff0c;但其与线程安全、Pin 等概念的结合仍较复杂&#xff0c;而爬虫高度依赖并发处理&#xff0c;进一步提高了开发成本。这就导致了使用Rust语言爬虫用的人很少。 下面是一个使用 Rust 编…

Electron 安全最佳实践:构建安全的桌面应用

Electron 是一个流行的框架&#xff0c;允许开发者使用 Web 技术&#xff08;HTML、CSS、JavaScript&#xff09;构建跨平台桌面应用。许多知名应用&#xff0c;如 VS Code、Slack 和 Discord&#xff0c;都基于 Electron 开发。然而&#xff0c;由于其结合了 Node.js&#xff…

MySQL 事务详解:从基础操作到隔离级别与 MVCC 原理

前言 首先从概念上进行理解什么是事务&#xff0c;以及事务的4大属性&#xff0c;知道是什么还要知道为什么&#xff1f; 事务是如何进行操作的&#xff0c;最后在谈事务的隔离性、隔离级别&#xff08;最重要但是也很难理解&#xff09;&#xff0c;理解隔离级别体现在哪里 …

【Unity 编辑器工具开发:GUILayout 与 EditorGUILayout 对比分析】

Unity 编辑器工具开发&#xff1a;GUILayout 与 EditorGUILayout 对比分析 一、核心区别对比 方面GUILayoutEditorGUILayout区别命名空间UnityEngineUnityEditorEditorGUILayout 仅限编辑器环境适用范围游戏运行时 编辑器工具仅限编辑器工具运行时禁用 EditorGUILayout渲染管…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!

摘 要 随着软件信息技术的兴起&#xff0c;许多手工作业也升级为软件管理数据&#xff0c;本次针对个人财务数据的管理&#xff0c;开发一款个人财务管理系统&#xff0c;该系统可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及…

Compose入门3 - 高仿小红书 界面

使用compose 实现一个小红书UI 界面&#xff0c;主要是为了锻炼 使用compose布局的能力 demo地址&#xff1a;https://github.com/PangHaHa12138/ComposeDemo 先上demo 截图 下面是完整的compose代码 package com.example.test001import android.annotation.SuppressLint imp…