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 开销大

每次插入都要分配内存

相关推荐
charlie11451419116 小时前
嵌入式Linux驱动开发(8)——内存映射 I/O - 别拿物理地址当指针用
linux·开发语言·驱动开发·c·imx6ull
_日拱一卒16 小时前
LeetCode:146LRU缓存
java·开发语言
StockTV16 小时前
韩国股票实时数据 KOSPI(主板)和 KOSDAQ(创业板)的实时行情、K 线及指数数据
java·开发语言·算法·php
无敌秋16 小时前
C++ 单例模式
c++·单例模式
Brilliantwxx16 小时前
【C++】认识标准库STL(2)
开发语言·c++
故事还在继续吗16 小时前
STL 容器算法手册
开发语言·c++·算法
啊我不会诶16 小时前
2023西安邀请赛vp补题
c++·算法
唠玖馆16 小时前
c++ list详解
c++
khalil102016 小时前
代码随想录算法训练营Day-38动态规划06 | 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包、总结
数据结构·c++·算法·leetcode·动态规划