[C++] list双向链表使用方法

目录

链表基本操作

定义类

双向链表有专门的头文件

cpp 复制代码
#include <list>
// 当然如果你用<bits/stdc++.h>的话就也无所谓了

忽然想到一件事情, 不会有人不知道bits/stdc++.h是什么吧?传送!

双向链表这样定义

cpp 复制代码
list<type> name;
// type: 链表每个元素的数据类型
// name: 链表名

// 下面是一个例子:
list<int> ls;		// 后面讲操作的时候就以ls为例

使用类

常规

增删改查都在下面:

cpp 复制代码
// 对链表开头操作
ls.push_front(x);	// 在ls开头添加x
ls.front();			// 返回ls开头元素
ls.pop_front();		// 删除ls开头元素

// 对链表末尾进行操作
ls.push_back(x);	// 在ls末尾添加x
ls.back();			// 返回ls末尾元素
ls.pop_back();		// 删除ls末尾元素

一些特殊的方法:

cpp 复制代码
ls.size();			// 返回ls的元素个数
ls.empty();			// 返回ls是否为空(空返回false, 否则true)
ls.clear();			// 清空ls

排序

cpp 复制代码
ls.sort();						// 升序
// 可以把一个函数当作参数传入, 传入则按照函数实现的排序规则来排序, 类似algorithm中的sort

ls.sort(greater</*type*/>()); 	// 降序
// type替换为ls对应的数据类型
// 如果不是在std命名空间中, 则需要使用以下方法
ls.sort(std::greater</*type*/>());

遍历

由于链表没有索引 , 我们使用迭代器(iterator)进行元素的访问 , 进而实现遍历的功能.

cpp 复制代码
ls.begin();		// 返回指向ls开头的迭代器
ls.end();		// 返回指向ls结尾的迭代器(最后一个元素的下一个位置)

这里比较难理解, 特别是end, 所以给大家配了一幅图

理解到这里后, 就可以开始讲遍历了:

cpp 复制代码
for(auto pos = ls.begin(); pos != ls.end(); pos++){
	// 元素使用*pos来访问
}

这里我们使用了C++11(或以上)特有 的auto, 如果版本较旧的话需要替换为list<type>::iterator, 把type替换为ls对应的数据类型.

如果你使用的是C++11(或以上), 推荐你使用一种更简便的方法:

cpp 复制代码
for(int num : ls){
	// 元素为num
}

这种方法有一个弊端, 就是不能局部遍历.

链表存储原理

相关推荐
沫璃染墨3 分钟前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光2 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记3 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw4 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨5 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光5 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy6 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw8 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck8 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt