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

每次插入都要分配内存

相关推荐
一只旭宝8 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
coder!mq10 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding10 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ10 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大10 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS10 小时前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式
quantdash_cc11 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
ydd10010011 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言
zh路西法11 小时前
【3D SLAM源码解读系列】(二)Small_gicp——5 个积木搭出最优点云配准
c++·pcl·icp·fastgicp·smallgicp·gicp
半亩码田11 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#