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

目录

前言

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

二:list的简介

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

1.构造函数接口

[2.list迭代器 +范围for](#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

相关推荐
「QT(C++)开发工程师」7 小时前
C++17三大实用特性详解:内联变量、std::optional、std::variant
jvm·c++
不爱吃炸鸡柳7 小时前
C++ STL 核心:string 从入门到精通(面试+源码+OJ实战)
java·c++·面试
南境十里·墨染春水7 小时前
C++笔记 Lambda表达式
开发语言·c++·笔记
悟渔7 小时前
用于STM32的C++编程的LED对象
c++·stm32·单片机
17(无规则自律)7 小时前
DFS:带重复项的全排列,程序运行全流程解析
c++·算法·深度优先
郝学胜-神的一滴7 小时前
「栈与缩点的艺术」二叉树前序序列化合法性判定:从脑筋急转弯到工程实现
java·开发语言·数据结构·c++·python·算法
AIminminHu8 小时前
OpenGL渲染与几何内核那点事-项目实践理论补充(三-1-(3):番外篇-当你的CAD打开“怪兽级”STL时:从内存爆炸到零拷贝的极致优化
c++·零拷贝·mmap·内存拷贝
水饺编程8 小时前
第4章,[标签 Win32] :SysMets3 程序讲解04,垂直滚屏重绘
c语言·c++·windows·visual studio
xiaoye-duck8 小时前
《算法题讲解指南:动态规划算法--子序列问题(附总结)》--32.最长的斐波那契子序列的长度,33.最长等差数列,34.等差数列划分II-子序列
c++·算法·动态规划
BestOrNothing_20158 小时前
C++零基础到工程实战(1.3):cpp注释与输出详解
c++·注释·命名空间·初学者教程·cout输出