forward list简介
forward list内部以singly linked来管理元素,也可以称为单向链表,它是一个行为受限的list,不能走回头路。创建的宗旨在于“我们希望forward_list和你自己手写的C-style singly linked list 相较之下没有任何空间或时间上的额外开销”。
使用条件:
包含头文件
#include<forward_list>
在这个头文件中forward list被定义为命名空间std内的一个class template
namespace std { template<typename T, typename Allocator = allocator<T> > class forward list; }
forward list的元素类型可以是任意指定的T。
foward list的能力
作为一个能力受限的list,foward list的优点是内存用量少,行动也略快速一些。
1.foward list只提供forward iterator(向前迭代器),不提供其他的迭代器,同时相对应的函数也不提供。
2.foward list不提供成员函数size()。
3.foward list没有指向最末元素的anchor,所以不提供类似back()等成员函数。
4.对于所有“令元素被安插或删除于forward list的某特定位置上”的成员函数,forward list提供特殊的版本,具体如何在下文有介绍。
forward list 的操作
1.创建,复制与销毁
forward_list<elem> c //default构造函数,产生一个空的forward list forward_list<elem> c(c2) //copy构造函数,建立c2的同型forward list并成为c2的一份拷贝 forward_list<elem> c(n) //利用default构造函数生成一个大小为n的forward list forward_list<elem> c(n,t) //建立一个大小为n的forward list,每个元素值都为t
forward_list<elem> c(beg,end) //建立一个forward list,以区间[beg,end)作为元素初值 c.~forward_list() //销毁所有元素,释放内存
2.非更易型操作
c.empty() //判断容器是否为空 c.max_size()//返回元素的最大可能数量
3.赋值与访问
foward list提供序列式容器通常都会有的赋值操作,在访问方面,你也只能使用rbf循环,特定的操作函数或迭代器
c=c2 //将c2的全部元素赋值给c c.assign(n,elem) //复制n个elem,赋值给c c.assign(beg,end) //将区间[beg,end)内所有元素赋值给c c.front() //返回第一元素,不报错
4.迭代器相关函数
forward list只提供forward迭代器,所以会大量改变元素次序的算法,特别是sorting算法,是不能随便用的,但forward list本身为排序提供了特殊的成员函数sort()。此外,为了能改变第一个元素,还提供了一些能产生更优先于“第一元素”的一个虚拟元素位置。
c.begin() //返回一个bidirectional iterator指向第一元素 c.end() //返回一个bidirectional iterator指向最末元素的下一位置 c.before_begin() //返回一个forward iterator指向第一元素的前一位置
5.安插和移除操作函数
c.push_front(elem) //在头部插入elem的一个拷贝 c.pop_front() //移除第一元素但不返回 c.insert_after(pos,elem) //安插一个elem拷贝于iterator位置pos之后,返回新元素位置 c.insert_after(pos,n,elem) //安插n个elem拷贝于iterator位置pos之后,并返回第一个新元素的位置 c.insert_after(pos,beg,end) //将区间[beg,end)所有元素复制一份,安插于iterator位置pos之后,并返回第一个新元素的位置 c.erase_after(pos) //移除iterator位置pos之后的元素,无返回值 c.erase_after(beg,end) //移除[beg,end)区间内的所有元素,无返回值 c.remove(val) //移除所有值为val的元素 c.remove_if(op) //移除所有“造成op(elem)结果为true”的元素 c.resize(num) //将元素数量改为num c.resize(num,elem) //将元素数量改为num,如果size()变大,多出来的新元素都是elem的拷贝 c.clear() //移除所有元素,清空容器
6.特殊更易型操作
c.unique() //如果存在若干相邻而数值相同的元素,就移除重复元素,只留一个 c.unique(op) //如果存在若干相邻元素都使op为true,就移除重复元素,只留一个 c.splice(pos,c2) //将c2内的元素转移到c之内,迭代器pos之前 c.splice(pos,c2,c2pos) //将c2内的c2pos所指元素转移到c内的pos所指位置 c.splice(pos,c2,c2beg,c2end) //将c2内的[c2beg,c2end)区间内所有元素转移到c内的pos之前 c.sort() //以operator<为准则为所有元素排序 c.sort(op) //以op()为准则为所有元素排序 c.merge(c2) //假设c和c2容器都包含op()准则下的已排序元素,将c2的全部元素转移到c,并保证合并后的list仍为已排序 c.merge(c2,op) //假设c和c2容器都包含已排序元素,将c2的全部元素转移到c,并保证合并后的list在op()准则下仍为已排序 c.reverse() //将所有元素反序