std::
forward_list
函数模板 <array>
template < class T, class Alloc = allocator<T> > class forward_list;
前向链表
前向链表是一种序列容器,它允许在序列中的任何位置进行常量时间的插入和擦除操作。
前向链表实现为单链表;单链表可以将所包含的每个元素存储在不同且不相关的存储位置。
顺序是通过与序列中下一个元素的链接中的每个元素的关联来保持的。
forward_list容器和list容器在设计上的主要区别在于前者在内部只保留到下一个元素的链接,
而后者为每个元素保留两个链接:一个指向下一个元素,一个指向前一个元素,
允许两个方向的高效迭代,但每个元素消耗额外的存储空间,插入和删除元素的时间开销稍微高一些。
因此,Forward_list对象比list对象更有效,尽管它们只能向前迭代。
与其他基本标准序列容器(array、vector和deque)相比,forward_list在插入、
提取和移动容器内任意位置的元素方面通常表现得更好,
因此在大量使用这些元素的算法(如排序算法)方面也表现得更好。
与其他序列容器相比,forward_lists和list的主要缺点是它们不能直接根据元素的位置访问元素;
例如,要访问forward_list中的第6个元素,必须从开始迭代到该位置,
这需要在这两个位置之间的距离上花费线性时间。
它们还会消耗一些额外的内存来保持与每个元素关联的链接信息
(对于小型元素的大列表来说,这可能是一个重要因素)。
forward_list类模板的设计是考虑到效率的:在设计上,它和简单的手写c风格单链表一样高效,
事实上,它是唯一一个出于效率考虑而故意没有size成员函数的标准容器:由于它是一个链表,
如果有一个size成员需要常量的时间,那么它就需要为它的大小保留一个内部计数器(就像list那样)。
这将消耗一些额外的存储空间,并使插入和删除操作的效率稍微低一些。
要获得forward_list对象的大小,可以使用distance算法的 begin和end,这是一个需要线性时间的操作。
☲ 容器特性
-
顺序排列
-
序列容器中的元素按照严格的线性顺序排列。每个元素根据它们在这个序列中的位置来访问。
-
链表
-
每个元素保留关于如何定位下一个元素的信息,
允许在特定元素(甚至是整个范围)之后进行常量时间的插入和擦除操作,但没有直接的随机访问。
-
分配方式
-
容器使用allocator对象来动态处理其存储需求。
☲ 模板参数
-
T
-
所包含元素的类型。
别名为成员类型forward::value_type。
-
Alloc
-
用于定义存储分配模型的allocator对象的类型。
默认情况下,使用allocator类模板,它定义了最简单的内存分配模型,并且是值独立的。
别名为成员类型forward_list:: alloator_type。
☉ 成员类型
成员类型 |
定义 |
注释 |
value_type |
起始模板参数(T) |
|
allocator_type |
第二个模板参数(Alloc) |
默认为: allocator< value_type > |
reference |
value_type& |
引用类型 |
const_reference |
const value_type& |
常引用 |
pointer |
allocator_traits<allocator_type>::pointer |
对于默认分配器: value_type* |
const_pointer |
allocator_traits<allocator_type>::const_pointer |
对于默认分配器: const value_type* |
iterator |
指向value_type的前向迭代器 |
可转换到const_iterator |
const_iterator |
指向const value_type的前向迭代器 |
|
difference_type |
一种有符号整型,相当于:
iterator_traits<iterator>::difference_type |
通常与ptrdiff_t相同 |
size_type |
无符号整型,可以表示任何difference_type的非负值 |
通常与size_t相同 |
☞ 成员函数
迭代器:
before_begin |
返回指向容器中第一个元素之前位置的迭代器 (公众成员函数) |
begin |
返回指向forward_list容器第一个元素的迭代器。 (公众成员函数) |
end |
返回一个指向forward_list容器末尾元素的下一个元素的迭代器 (公众成员函数) |
cbefore_begin |
返回指向容器中第一个元素之前位置的常量迭代器(公众成员函数) |
cbegin |
返回指向容器第一个元素的const_iterator对象 (公众成员函数) |
cend |
返回一个指向容器末尾元素的下一个元素的常量迭代器 (公众成员函数) |
容量:
元素访问:
修改器:
☣ 操作
空间配置器:
☣ 非成员函数重载