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

每次插入都要分配内存

相关推荐
_wyt00131 分钟前
多重背包问题详解
c++·背包dp
段一凡-华北理工大学1 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe1 小时前
C++——多态
开发语言·c++
越甲八千2 小时前
STL stack为何没有迭代器
c++
心平气和量大福大2 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_3 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸3 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地4 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
王维同学4 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
程序员Rock5 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机