zoukankan      html  css  js  c++  java
  • C++STL容器forward list

    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()                    //将所有元素反序
  • 相关阅读:
    vue table 中 列 加上 下划线和click 方法
    vue 比较好的学习文章
    Hive 以及mysql 中如何做except 数据操作
    oracle 日期维表 原始版本 带注解
    RMI 实现的rpc 远程过程调用 Java
    剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
    剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
    模拟通讯录
    剑指offer17:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
    剑指offer16:输入两个单调递增的链表,合成后的链表满足单调不减规则。
  • 原文地址:https://www.cnblogs.com/cloudplankroader/p/10458720.html
Copyright © 2011-2022 走看看