-
List #include<list>
使用doubly linked list管理元素
特性:
List自身提供两个pointer指向第一个和最后一个元素,每个元素有两个pointer指向前一个和后一个元素,安插元素只需操作相应的pointer即可。
与前三个容器不同:
-
不支持随机访问,访问任意元素很缓慢,可以从两端开始航行整个list
-
任何位置的安插都很快,常量时间
-
安插和删除元素并不会使reference、pointer、iterator失效
-
对异常要么成功要么不发生
List提供的成员函数:
-
front()、push_front()、pop_front()、push_back()、pop_back()、back()
-
不支持随机访问,不提供 [ ]、和at()
-
没有必要重新分配内存
-
提供了不少特殊成员函数,用于移动和删除元素,比STL通用算法快,因为只需调整pointer即可
-
List的操作
创建复制销毁、非更易操作、赋值操作没有特殊。
-
元素访问
Range-based for、操作函数、迭代器。
不支持随机访问,只有front()、back()可以直接访问
对空容器任何操作导致不明确行为
-
迭代器相关函数
只有运用迭代器才能访问list中各个元素,提供双向迭代器,反向迭代器,用到随机访问迭代器的算法(操作元素顺序的算法、排序算法)都不能处理list,但是list提供特殊成员函数sort()
-
安插和移除
提供deque的所有功能,还增加了remove()、remove_if()算法的特殊版本。速度更快,只进行内部pointer操作,不改变元素。
保证:1.迭代器必须指向一个合法位置2.区间的其实位置不能在位置结束之后
安插多个元素时调用一次更快
操作函数不会造成iterator和reference失效。
-
异常处理
STL所有容器中,List对于异常的安全性提供了最佳支持。
List特殊更易操作:P297(区别于一般算法)
-
-
Foeward list #include<forward_list>
-
List的操作
创建复制销毁操作没有特殊。
-
非更易操作
不提供.size()操作,不存储元素的数目,无法在常量时间计算他。计算元素个数可以用distance()(应用广泛),具有线性复杂度,需要#include<iterator>
-
赋值
序列式容器都有的赋值操作
-
元素访问
Range-based for、操作函数、迭代器。
不支持随机访问,只有front()可以直接访问
对空容器任何操作导致不明确行为
-
迭代器相关函数
运用迭代器才能访问list中各个元素,提供双向迭代器(表示不解)、单向迭代器
无法调用双向或随机迭代器的算法,所有大量改变元素次序的算法特别是sort算法都是此类。Forward list提供了特殊成员函数sort()
此外提供.befor_begin()、.cbefor_begin()为了改动第一个元素,不能将.befor_begin()作STL任何算法的第一实参。
-
安插和删除
保证:1.迭代器必须指向一个合法位置2.区间的其实位置不能在位置结束之后
安插多个元素时调用一次更快
提供remove()、remove_if()算法的特殊版本。速度更快,只进行内部pointer操作,不改变元素。
对于forward list,无法回头,与list不同,后缀_after安插或删除在给定元素之后P306
-
查找移除和安插
查找准则应该是下一个满足条件的当时元素,用两个迭代器或者用便捷函数next()。
可以定义自己的算法,找出拥有特定值得元素的前一位置。
-
接合函数
与list一样可以在常量时间内移除和安插元素于任何位置,只需重定位pointer即可forward List特殊更易操作:P310(区别于一般算法)
-
异常处理
-