前向链表
template <class T, class Alloc = allocator()> class forward_list;
< forward_list >
forward lists是一种序列容器,其中插入和删除消耗常量时间。
forward lists被实现为单链表,单链表中的元素分布在内存中的不同位置。它们的顺序是通过每一个元素中向后一个元素的next链接维持的。
forward_list容器和list容器的主要区别是:在list中除了头元素只有向后的链接,其它元素都有向前向后两个链接,这使得双向的迭代操作都可以高效进行,但每个元素占用内存变多且在进行插入和删除操作时会多消耗一点时间。因此forward_list比list更高效,虽然它只能向前迭代。
相比于其它标准容器(array,vector,deque),forward_list在任何位置上的插入、删除、移动元素的操作都更高效,因此在大量使用上述基本操作的算法中表现出色,例如排序。
相比于其它标准容器,forward_list和list最主要的缺点是不能直接通过位置访问元素,例如,要访问第六个元素forward_list必须从开始一直迭代到这个位置,这会消耗线性的时间。同时,它们还需要维护额外的内存(指向前或后一个元素的链接)。
forward_list模板类在逻辑上被设计为高效的:它就像手写的C-风格的单链表一样高效,而且为了效率考虑它是唯一一个没有size()成员函数的标准容器:因为它的天然特性,计算它的尺寸需要在内部维护一个counter计数器(这会消耗额外的内存,并会使插入、删除操作效率变低)。要想获取forward_list的尺寸,你可以使用distance算法,用它的begin()和end()迭代器作为参数,这回消耗线性的时间。
容器属性
- 顺序性
所有的元素按顺序排列在一个严格线性的序列中,可以通过它们的位置来访问。 - 链接性
每个元素中包含了下一个元素的位置的信息,这使得插入、删除操作消耗常量时间,但同时元素不支持直接的随机访问。 - 分配器感知
容器使用了一个分配器对象来动态管理所需内存。
模板参数
- T
元素类型,别名forward_list::value_type - Alloc
用来定义存储分配模型的分配器对象的类型。默认情况下,使用分配器类模板,该模板定义了最简单的内存分配模型并且与值无关。别名forward_list::allocator_type
成员函数
构造函数
/* 默认 */
explicit forward_list(const allocator_type& alloc = allocator_type());
/* 填充 */
explicit forward_list(size_type n);
explicit forward_list(size_type n, const value_type& val, const allocator_type& alloc = allocator_type());
/* 范围 */
template <class InputIterator>
forward_list(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());
/* 拷贝构造 */
forward_list(const forward_list& x);
forward_list(const forward_list& x, const allocator_type& alloc);
/* 移动构造 */
forward_list(forward_list&& x);
forward_list(forward_list&& x, const allocator_type& alloc);
/* 初始化列表 */
forward_list(initializer_list<value_type> il, const allocator_type& alloc);
// 举例
// forward_list constructors
#include <iostream>
#include <forward_list>
int main ()
{
// constructors used in the same order as described above:
std::forward_list<int> first; // default: empty
std::forward_list<int> second (3,77); // fill: 3 seventy-sevens
std::forward_list<int> third (second.begin(), second.end()); // range initialization
std::forward_list<int> fourth (third); // copy constructor
std::forward_list<int> fifth (std::move(fourth)); // move ctor. (fourth wasted)
std::forward_list<int> sixth = {3, 52, 25, 90}; // initializer_list constructor
std::cout << "first:" ; for (int& x: first) std::cout << " " << x; std::cout << '\n';
std::cout << "second:"; for (int& x: second) std::cout << " " << x; std::cout << '\n';
std::cout << "third:"; for (int& x: third) std::cout << " " << x; std::cout << '\n';
std::cout << "fourth:"; for (int& x: fourth) std::cout << " " << x; std::cout << '\n';
std::cout << "fifth:"; for (int& x: fifth) std::cout << " " << x; std::cout << '\n';
std::cout << "sixth:"; for (int& x: sixth) std::cout << " " << x; std::cout << '\n';
return 0;
}
// Output
forward_list constructor examples:
first:
second: 77 77 77
third: 77 77 77
fourth:
fifth: 77 77 77
sixth: 3 52 25 90
迭代器
before_begin() // 指向第一个元素前面的迭代器
beign()
end()
cbefore_begin()
cbegin()
cend()
容量
max_size()
empty()
读取元素
front()
元素操作
assign()
emplace_front()
push_front()
pop_front()
emplace_after()
insert_after()
erase_after()
swap()
resize()
clear()
/* insert_after()和erase_after()会改变传入的迭代器所指的位置 */
splice_after()
remove()
remove_if()
unique()
merge()
sort()
reverse()