std::forward_list是c++11引入的单向链表容器,内存占用小、支持前向遍历和高效插入删除,但不提供size()函数且仅支持after类操作,适用于内存敏感且无需反向访问的场景。

std::forward_list 是 C++11 引入的一个标准库容器,位于 <forward_list> 头文件中。它实现了一个单向链表(singly linked list),与其他序列容器如 std::vector、std::list 相比,有其独特的设计和使用场景。
只提供前向遍历能力
std::forward_list 是单向链表,每个节点只包含指向下一个节点的指针,不能反向访问。
- 只能通过迭代器从前向后遍历元素。
- 不支持反向迭代器(如 rbegin/rend)。
- 相比 std::list,内存开销更小,每个节点少一个指针。
轻量且节省内存
由于是单向结构,forward_list 在每个节点上只存储一个 next 指针,而 std::list 需要 prev 和 next 两个指针。
- 节点更紧凑,适合对内存敏感的应用。
- 插入和删除操作不会使其他元素的迭代器失效(除了被删元素本身)。
不提供 size() 成员函数
std::forward_list 没有内置的 size() 方法来返回元素个数。
立即学习“C++免费学习笔记(深入)”;
- 要获取长度,必须调用 std::distance(begin(), end()),时间复杂度为 O(n)。
- 这是为了保持容器尽可能轻量,避免维护额外的大小计数器。
特有的插入与拼接操作
由于没有尾指针,不能在常数时间内进行尾部插入。大多数修改操作以“在某个位置之后插入”形式提供。
- insert_after:在指定位置之后插入元素。
- emplace_after:原地构造元素,提高性能。
- splice_after:将另一个 forward_list 的部分或全部元素移动到当前位置之后。
提示:若需频繁在尾部添加元素,可自行维护尾迭代器,或考虑是否更适合使用 std::list。
适用场景建议
forward_list 适合以下情况:
- 数据量不大,但对内存占用敏感。
- 主要从前向后遍历,不需要反向访问。
- 频繁在中间位置插入或删除元素。
- 不需要快速获取容器大小。
基本上就这些。std::forward_list 是一个专注空间效率的轻量级链表容器,虽然功能不如 std::list 灵活,但在特定场合能发挥优势。理解它的限制和特点,有助于做出合理的容器选择。


