1.常用接口
1.1初始化与构造
std::list<int> l1;
创建一个空的双向链表,模板参数指定元素类型为int。
std::list<int> l2(5, 10);
创建包含5个元素的链表,每个元素初始化为10。
std::list<int> l3 = {1, 2, 3};
通过初始化列表构造链表,包含元素1、2、3。
1.2元素访问
l.front()
返回链表第一个元素的引用。若链表为空,行为未定义。
l.back()
返回链表最后一个元素的引用。若链表为空,行为未定义。
注意:std::list不提供随机访问接口(如operator[]),因链表结构不支持O(1)时间复杂度的随机访问。
1.3迭代器操作
l.begin() / l.end()
返回指向首元素和尾后位置的迭代器。
l.rbegin() / l.rend()
返回反向迭代器,用于逆序遍历。
示例遍历:
cpp
for (auto it = l.begin(); it != l.end(); ++it) {
std::cout << *it << " ";
}
1.4插入与删除
l.push_back(10)
在链表末尾插入元素10。
l.push_front(20)
在链表头部插入元素20。
l.insert(it, 30)
在迭代器it指向的位置前插入30,返回新元素的迭代器。
l.pop_back()
删除末尾元素,链表为空时行为未定义。
l.pop_front()
删除头部元素,链表为空时行为未定义。
l.erase(it)
删除迭代器it指向的元素,返回下一个有效迭代器。
1.5容量操作
l.empty()
判断链表是否为空,时间复杂度O(1)。
l.size()
返回元素数量,C++11起保证为O(1),早期实现可能为O(n)。
l.resize(10)
调整链表大小为10,不足时用默认值填充,多余元素被删除。
1.6特殊操作
l.splice(it, other_list)
将other_list的所有元素移动到当前链表的it位置前,other_list变为空。
l.sort()
对链表进行排序,默认升序。可传入比较函数:
cpp
l.sort(std::greater<int>()); // 降序排序
l.merge(other_list)
合并两个已排序链表,结果保存在当前链表,other_list变为空。
l.unique()
删除连续重复元素。可传入二元谓词判断重复条件。
1.7示例代码
cpp
#include <iostream>
#include <list>
int main() {
std::list<int> l = {5, 3, 1};
l.push_back(7); // 5, 3, 1, 7
l.push_front(2); // 2, 5, 3, 1, 7
l.sort(); // 1, 2, 3, 5, 7
auto it = l.begin();
std::advance(it, 2);
l.insert(it, 4); // 1, 2, 4, 3, 5, 7
l.remove_if([](int x) { return x % 2 == 0; }); // 删除偶数
for (int x : l) {
std::cout << x << " "; // 输出: 1 3 5 7
}
}
2.对比list和vector
2.1详细对比表
| 特性 | vector (动态数组) | list (双向链表) |
|---|---|---|
| 内存结构 | 连续内存 | 分散节点,每个节点存数据 + 前后指针 |
| 随机访问 | 支持 O (1) ,直接用 [] / at() |
不支持,只能从头 / 尾遍历 |
| 头部插入 | 慢 O (n),需要移动所有元素 | 快 O (1) |
| 尾部插入 | 快 O (1)(偶尔扩容) | 快 O (1) |
| 中间插入 / 删除 | 慢 O (n),需要移动数据 | 快 O (1)(已知迭代器时) |
| 迭代器失效 | 插入 / 删除容易失效 | 只有删除节点失效,其他不受影响 |
| 内存占用 | 小(紧凑) | 大(每个节点多存两个指针) |
| 缓存效率 | 高(连续内存,CPU 缓存友好) | 低(跳跃访问,缓存不命中) |
| 适用场景 | 读多、尾部增删、需要随机访问 | 频繁中间插入 / 删除、不需要随机访问 |
2.2关键功能差异详解
vector ✅ 支持随机访问
cpp
vector<int> v = {1,2,3};
cout << v[1]; // 直接访问,超快
list ❌ 不支持随机访问
cpp
list<int> l = {1,2,3};
// cout << l[1]; 报错!没有[]运算符
想访问中间元素必须遍历,效率极低。
2.3插入 / 删除速度
vector:尾部 push_back:极快 中间 / 头部插入:很慢(要移动后面所有元素)
list:任意位置插入 / 删除:都很快(只改指针,不移动数据)
2.4. 迭代器失效
vector:扩容 / 插入 / 删除 → 很多迭代器直接失效
list:只有被删除的那个节点迭代器失效,其他都安全。
谢谢