forward_list
std::forward_list 是 C++11 引入的单向链表容器。和 std::list 的双向链表不同,forward_list 每个节点只存指向下一个节点的指针,因此更省内存,但只能单向遍历。
头文件与基本特征
#include <forward_list>
| 特征 | 说明 |
|---|---|
| 底层结构 | 单向链表 |
| 遍历方向 | 仅向前 |
| 内存开销 | 每节点一个指针,比 list 少一半 |
| 随机访问 | 不支持 |
| 插入删除 | 指定位置之后 O(1) |
size() | C++11 中通常没有(为保持 O(1) 时间,C++11 不要求) |
基本用法
#include <forward_list>
#include <iostream>
int main() {
std::forward_list<int> fl;
fl.push_front(3);
fl.push_front(2);
fl.push_front(1);
for (std::forward_list<int>::iterator it = fl.begin(); it != fl.end(); ++it) {
std::cout << *it << ' ';
}
// 输出:1 2 3
return 0;
}
forward_list 没有 push_back() 和 size()(C++11),插入操作在指定位置之后(因为单向链表无法便宜地访问前驱节点)。
常用接口
| 接口 | 作用 |
|---|---|
push_front(x) | 头部插入 |
pop_front() | 删除头部 |
insert_after(pos, x) | 在指定位置之后插入 |
erase_after(pos) | 删除指定位置之后的元素 |
before_begin() | 返回首元素之前的迭代器(用于在头部之前插入) |
empty() | 判断是否为空 |
clear() | 清空 |
splice_after() | 转移元素 |
reverse() | 反转链表顺序 |
sort() / merge() | 排序 / 合并有序链表 |
使用注意
- 只能前向遍历,不能反向迭代。
- 插入在位置之后不是之前(
insert_after/erase_after)。 - 没有
size()成员函数(C++11),用std::distance(begin(), end())替代(O(n))。 - 如果只需单向遍历且追求内存效率,优先
forward_list;否则用list。
小结
std::forward_list 是最精简的链表容器,每节点只需一个指针。适合单向遍历为主的简单链表场景,成本意识强的场合首选。