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
。emplace_front(Args&&... args)
:在链表头部原位构造元素。insert_after(iterator position, const T& value)
:在指定迭代器position
之后插入元素value
。emplace_after(iterator position, Args&&... args)
:在指定迭代器position
之后原位构造元素。
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