C++修炼之路之list--C++中的双向循环链表

news/2024/9/22 18:21:16/

目录

前言

一:正式之前先回顾数据结构中的双向循环链表

二:list的简介

三:STL中list常用接口函数的介绍及使用

1.构造函数接口

2.list迭代器 +范围for

3.数据的修改接口函数 

4.list容量操作函数 

5.list的迭代器失效

6.演示代码和测试用例链接

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

前言

list简单来说就是数据结构中的双向循环链表,作为链表中的顶级结构,双向循环链表的任意位置插入删除数据效率高,而且不用像单链表那样分情况来讨论插入删除的情况,在C++中经过封装变为了常用的list,接下来我们就将介绍它

一:正式之前先回顾数据结构中的双向循环链表

对于双向循环链表的结构与使用可以参考本篇文章

https://blog.csdn.net/Miwll/article/details/136593441?spm=1001.2014.3001.5501

了解双向循环链表的结构,方便模拟实现list

二:list的简介

对于list在官方文档中的介绍为

https://cplusplus.com/reference/list/list/?kw=list

1.list是可以在常熟时间范围内在任意位置进行插入和删除的容器,并且支持前后双向迭代遍历数据

2.对比与其他的容器,list是不支持任意位置的随机访问的,必须从已知位置开始往后遍历寻找

三:STL中list常用接口函数的介绍及使用

1.构造函数接口

 对于构造常规的就是这几种,只需多使用便没问题

list<int> lt1;//无参构造
for (auto e : lt1)
{cout << e << " ";
}
cout << endl;list<int> lt2(10,2);//n个val来构造
for (auto e : lt2)
{cout << e << " ";
}
cout << endl;list<int> lt3(lt2);//拷贝构造
for (auto e : lt3)
{cout << e << " ";
}
cout << endl;list<int>lt4(lt3.begin(), lt3.end());//用一段迭代器来构造
for (auto e : lt4)
{cout << e << " ";
}
cout << endl;

2.list迭代器 +范围for

对于此处的迭代器我们可以理解为一个指针,指向list中的某个节点 

常常的有普通迭代器和const对象用的const迭代器,正向反向迭代器

对于list中的迭代器是比较复杂的,在模拟实现中会详细介绍的 

list<int> lt2(10, 2);//n个val来构造
list<int>::iterator it = lt2.begin();//迭代器
while (it != lt2.end())
{cout << *it << " ";++it;
}
cout << endl;for (auto e : lt2)
{cout << e << " ";
}
cout << endl;list<int>::reverse_iterator rit = lt2.rbegin();//反向迭代器
while (rit != lt2.rend())
{cout << *rit << " ";++rit;
}
cout << endl;

3.数据的修改接口函数 

对于insert和erase操作使用的是迭代器位置来插入和删除,剩余的操作便是常见的

list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
lt1.push_back(5);
for (auto e : lt1)
{cout << e << " ";
}
cout << endl;lt1.push_front(10);//前插10
for (auto e : lt1)
{cout << e << " ";
}
cout << endl;lt1.insert(lt1.begin(),10);//头插10
for (auto e : lt1)
{cout << e << " ";
}
cout << endl;lt1.erase(lt1.begin());//头删
for (auto e : lt1)
{cout << e << " ";
}
cout << endl;
lt1.clear();//清空数据

4.list容量操作函数 

对于list是不需要添加resize和reserve这下扩容接口函数 ,是直接就可以创建节点来操作的

cout << lt2.size() << endl;
cout << lt2.empty() << endl;

 对于剩下的接口函数大家可以参考文档自行解决

https://cplusplus.com/reference/list/list/?kw=list

5.list的迭代器失效

迭代器失效指的是迭代器指向的节点无效,即该节点被删除了,因为list的底层结构为带头循环双向链表,在进行插入操作时是不会导致list的迭代器失效的,只有在删除时才会失效,失效的是指向被删除节点的迭代器,其他迭代器不会受影响,所以在删除操作时要接收返回值

6.演示代码和测试用例连接

https://gitee.com/lin-ciyu/cplusplus/blob/master/STL_list/STL_list/Test.cpp


http://www.ppmy.cn/news/1428549.html

相关文章

iOS RACScheduler 使用详解

RACScheduler 是 ReactiveCocoa 框架中的一个关键组件&#xff0c;用于在 iOS 开发中管理任务的并发执行。以下是如何详细使用 RACScheduler 的指南&#xff0c;以 Markdown 格式展示。 主要调度器 主线程调度器 用于在主线程上执行任务&#xff0c;通常用于 UI 更新操作。 …

2024年4月13日美团春招实习试题【第一题:好子矩阵】-题目+题解+在线评测【模拟】

2024年4月13日美团春招实习试题【第一题:好子矩阵】-题目题解在线评测【模拟】 题目描述&#xff1a;输入描述输出描述样例 解题思路一&#xff1a;模拟解题思路二&#xff1a;思路二解题思路三&#xff1a;直接判断 题目描述&#xff1a; 塔子哥定义一个矩阵是”好矩阵”&…

四.RocketMQ的几种消息发送方式应用

RocketMQ的几种消息发送方式应用 一&#xff1a;普通消息1&#xff09;发送同步消息2&#xff09;发送异步消息3&#xff09;单向发送消息4&#xff09;消费消息-负载均衡模式5&#xff09;消费消息-广播模式 二&#xff1a;顺序消息1.顺序消息指的是:严格按照消息的发送顺序进…

ubuntu安装QEMU

qemu虚拟机的使用&#xff08;一&#xff09;——ubuntu20.4安装QEMU_ubuntu安装qemu-CSDN博客 遇到的问题&#xff1a; (1)本来使用git clone https://github.com/qemu/qemu.git fatal: 无法访问 https://github.com/qemu/qemu.git/&#xff1a;GnuTLS recv error (-110): …

OpenHarmony实战开发-页面深色模式适配。

介绍 本示例介绍在开发应用以适应深色模式时&#xff0c;对于深色和浅色模式的适配方案&#xff0c;采取了多种策略如下&#xff1a; 1. 固定属性适配&#xff1a;对于部分组件的颜色属性&#xff0c;如背景色或字体颜色&#xff0c;若保持不变&#xff0c;可直接设定固定色值…

SQL中WITH RECURSIVE的用法

SQL中WITH RECURSIVE的用法 文章目录 SQL中WITH RECURSIVE的用法定义**WITH RECURSIVE 结构通常包含以下几个关键部分&#xff1a;****1. CTE&#xff08;Common Table Expression&#xff0c;公用表表达式&#xff09;&#xff1a;**2.递归查询的结构3.连接操作符&#xff1a;…

【C语言】每日一题,快速提升(2)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个…

基于SpringCloudAlibaba+Sentinel的分布式限流设计

胡弦&#xff0c;视频号2023年度优秀创作者&#xff0c;互联网大厂P8技术专家&#xff0c;Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者&#xff0c;资深架构师&#xff0c;技术负责人&#xff0c;极客时间训练营讲师&#xff0c;四…