forward_list
std::forward_list 是 C++11 引入的 STL 容器,它实现了单向链表(Singly Linked List),与 std::list 不同的是,std::forward_list 只有前向指针,不能向后遍历,因此它的空间开销比 std::list 更小。
1. std::forward_list 的主要特点
std::forward_list 的主要特点单向链表:
std::forward_list是单向链表,它只提供对下一个元素的访问,即只能从头到尾进行遍历,无法反向遍历。空间效率更高:由于每个节点只维护一个前向指针,所以与
std::list相比,std::forward_list的内存开销更低。不支持随机访问:
std::forward_list不像std::vector或std::deque那样支持随机访问。为了找到某个特定元素,需要从头开始遍历链表。常数时间的插入和删除:与
std::list类似,std::forward_list也支持常数时间内的插入和删除操作,特别是在链表头部和中间位置。
2. std::forward_list 的常用方法
std::forward_list 的常用方法2.1 插入元素
push_front(const T& value):在链表头部插入元素value。std::forward_list<int> flist; flist.push_front(10); // 在头部插入 10 flist.push_front(20); // 在头部插入 20emplace_front(Args&&... args):在链表头部原位构造元素。flist.emplace_front(30); // 在头部原位构造 30insert_after(iterator position, const T& value):在指定迭代器position之后插入元素value。auto it = flist.begin(); flist.insert_after(it, 25); // 在第一个元素之后插入 25emplace_after(iterator position, Args&&... args):在指定迭代器position之后原位构造元素。flist.emplace_after(it, 35); // 在第一个元素之后原位构造 35
2.2 删除元素
pop_front():删除链表头部的元素。erase_after(iterator position):删除迭代器position之后的元素。clear():删除链表中的所有元素。
2.3 访问元素
front():返回链表头部的元素。
2.4 遍历元素
使用迭代器遍历:
使用范围循环遍历:
2.5 其他操作
empty():检查链表是否为空。如果链表为空,则返回true。max_size():返回链表能容纳的最大元素数量。resize(size_type n):调整链表的大小。如果链表当前大小小于n,则插入默认值填充;如果大于n,则移除多余的元素。sort():对链表中的元素进行升序排序。reverse():将链表中的元素顺序反转。merge(forward_list<T>& other):将other链表中的元素合并到当前链表中,合并后other变为空。unique():移除链表中连续相等的重复元素。
3. 示例代码
4. std::forward_list 的常见应用场景
std::forward_list 的常见应用场景1. 轻量级链表结构
std::forward_list 适合在需要链表结构,但对内存消耗和性能有较高要求的场景。由于它比 std::list 节省更多内存,因此适合嵌入式系统或内存受限的环境。
2. 需要频繁插入/删除的场景
与 std::list 类似,std::forward_list 适合需要频繁在序列头部或中间插入/删除元素的场景,比如任务调度、消息传递系统等。
3. 排序、合并、去重
在需要对数据进行排序、合并或去重的场景下,std::forward_list 也提供了非常高效的操作方式。
5. 总结
push_front()
在链表头部插入元素
insert_after()
在指定位置之后插入元素
erase_after()
删除指定位置之后的元素
pop_front()
删除链表头部的元素
front()
返回链表头部的元素
empty()
检查链表是否为空
sort()
对链表中的元素进行排序
reverse()
反转链表中的元素顺序
merge()
合并两个链表
unique()
移除连续的重复元素
std::forward_list 是一个内存高效的单向链表,适合在需要链表功能但希望降低内存开销的场景中使用。
Last updated