C++ STL 容器 forward_list类型
介绍
std::forward_list
是 C++ 标准模板库 (STL) 中的一个单向链表容器。与 std::list
不同,std::forward_list
只允许从头部到尾部的单向迭代,不支持反向迭代。因此,std::forward_list
在某些操作上可能比 std::list
更高效,尤其是在插入和删除元素时。
下面是 std::forward_list
的一些主要特点和操作:
特点
-
单向迭代:
std::forward_list
只提供单向迭代器,这意味着你只能从链表的头部开始遍历到尾部。 -
内存效率:
std::forward_list
通常比std::list
更节省内存,因为它不需要存储每个节点的前驱指针。 -
常数时间插入和删除:在
std::forward_list
的头部插入和删除元素是常数时间操作。然而,在链表中间或尾部插入或删除元素需要线性时间,因为需要遍历到相应的位置。 -
不支持随机访问:由于
std::forward_list
是链表结构,因此不支持随机访问迭代器。你不能使用下标操作符([]
)或at()
函数来直接访问元素。
操作
std::forward_list
提供了一系列成员函数来操作链表:
begin()
: 返回指向链表第一个元素的迭代器。end()
: 返回指向链表末尾之后位置的迭代器。empty()
: 检查链表是否为空。size()
: 返回链表中元素的数量。front()
: 返回链表中第一个元素的引用。back()
: 返回链表中最后一个元素的引用。push_front(const value_type& value)
: 在链表头部插入一个元素。pop_front()
: 删除链表头部的元素。insert_after(const_iterator position, const value_type& value)
: 在给定位置之后插入一个元素。erase_after(const_iterator position)
: 删除给定位置之后的元素。clear()
: 清空链表中的所有元素。swap(forward_list& other)
: 交换两个链表的内容。
forward_list中的特殊迭代器
a.before_begin(); //返回一个指向链表之前的迭代器
a.erase_after(a.before_begin());
// 这个函数删除由pos参数指定的位置之后的元素。
//如果pos是before_begin()返回的迭代器,那么erase_after实际上会删除链表的第一个元素。
代码
using Group = std::forward_list<float>;
// 初始化
Group a;
Group b=a;
Group c(a);
Group d(1.1);
Group e(1.1,2.2);
Group f(e.begin(),e.end());
Group g({1.0f,2.0f,3.0f});
Group h = {1.0f,2.0f};
auto bb = a.before_begin(); //返回一个指向链表之前的迭代器
a.erase_after(a.before_begin());
// 这个函数删除由pos参数指定的位置之后的元素。
//如果pos是before_begin()返回的迭代器,那么erase_after实际上会删除链表的第一个元素。
b.push_front(1.2f); //先构造一个元素,然后插入头部
b.emplace_front(1.3f); //在forward_list头部直接构造一个元素,比push_front更快
auto iter = b.insert_after(b.before_begin(),100.0f); //在链表第一个元素位置插入100f,返回位置迭代器
iter = b.insert_after(b.before_begin(),10,-10.0f);
b.insert_after(b.before_begin(),h.begin(),h.end());
b.remove(1.0f); //删除1.0f
b.remove_if([](auto u){ //自定义删除
return u>100.0f;
});
b.reverse(); //元素位置全部首尾交换
b.sort(); //排序
b.merge(g); //合并两个链表,然后g的元素跟着b的末尾元素位置,g元素清空
b.unique(); //删除掉链表中重复元素
b.splice_after(b.before_begin(),c );
//把c全部元素移动到b的首部,移动过去的时候c元素顺序不变,c内容被清空
标签:std,begin,STL,元素,list,C++,链表,forward
From: https://www.cnblogs.com/AndreaDO/p/18038390