C++STL容器forward list

c/c++

浏览数:272

2019-6-8

AD:资源代下载服务

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()                    //将所有元素反序

 

作者:回首不知身是客