前言
在掌握了 vector 之后,我们来看看 STL 中的另一个重要序列容器——list。它基于双向循环链表实现,提供了不同的性能特性。本文将介绍其用法、迭代器安全机制,并尝试手写一个简化版实现。
一、list 的介绍和使用
1.1 list 的基本概念
list 底层是带头结点的双向循环链表。这意味着它在内存中不需要连续存储,插入和删除操作通常比 vector 更高效,但随机访问能力较弱。
1.2 常用接口
构造
list 支持多种初始化方式,包括默认构造、拷贝构造、区间构造以及 C++11 的列表初始化。
list<int> l1; // 空列表
list<int> l2(4, 100); // 4 个 100
list<int> l3(l2.begin(), l2.end()); // 区间构造
list<int> l4{1, 2, 3}; // 列表初始化
迭代器
list 提供正向和反向迭代器。注意,rbegin() 返回的是 reverse_iterator,指向最后一个元素,而 rend() 指向第一个元素之前。
auto it = l.begin();
while(it != l.end()){
cout << *it << " ";
++it;
}
增删改查
list 支持在头部和尾部进行 push/pop 操作,这是 deque 也有的特性,但 list 更强调中间节点的插入删除。
L.push_back(4);
L.push_front(0);
L.pop_back();
L.();


