STL:list

list 是什么?

list 本质是:双向链表

cpp 复制代码
std::list<int> l = {1,2,3};

底层结构

nullptr <- 1 <-> 2 <-> 3 -> nullptr

特点:

不连续内存

每个节点单独分配(malloc/new)

list 的核心特性

插入/删除超级快

cpp 复制代码
auto it = l.begin();
l.insert(it, 10);
l.erase(it);

时间复杂度:O(1)

原因:

只需要改指针,不用移动数据

不支持随机访问

cpp 复制代码
l[0]; ❌ 不存在

只能:

cpp 复制代码
auto it = l.begin();
++it;

时间复杂度: O(n)

迭代器稳定

cpp 复制代码
auto it = l.begin();
l.push_back(10);

// it 仍然有效 ✅

原因:

每个节点独立,不会搬家!

list 常用接口

插入

cpp 复制代码
l.push_back(10);
l.push_front(5);
l.insert(it, 100);

删除

cpp 复制代码
l1.merge(l2);
cpp 复制代码
l.pop_back();
l.pop_front();
l.erase(it);
l.remove(10);   // 删除所有值为10的

特有操作(vector 没有)

splice(链表拼接)

cpp 复制代码
list<int> l1 = {1,2,3};
list<int> l2 = {4,5};

l1.splice(l1.begin(), l2);

结果:

l1: 4 5 1 2 3
l2: 空

时间复杂度:O(1)

merge(有序链表合并)

cpp 复制代码
l1.merge(l2);

sort(链表排序)

cpp 复制代码
l.sort();

注意:

std::sort 不能用在 list 上!

为什么 list 很少用?

虽然 O(1) 插入很诱人,但实际:

缺点很多:

cache 不友好

节点分散,CPU 访问慢

内存浪费

每个节点多两个指针

malloc 开销大

每次插入都要分配内存

相关推荐
郝学胜_神的一滴19 小时前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天1 天前
C++ 基础入门完全指南
c++
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK3 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境4 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境4 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴5 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境7 天前
C++ 的Eigen 库全解析
c++
卷无止境7 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴7 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake