跳到主要内容
版本:Next

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()排序 / 合并有序链表

使用注意

  1. 只能前向遍历,不能反向迭代。
  2. 插入在位置之后不是之前(insert_after / erase_after)。
  3. 没有 size() 成员函数(C++11),用 std::distance(begin(), end()) 替代(O(n))。
  4. 如果只需单向遍历且追求内存效率,优先 forward_list;否则用 list

小结

std::forward_list 是最精简的链表容器,每节点只需一个指针。适合单向遍历为主的简单链表场景,成本意识强的场合首选。