• C++STL容器list


    list简介

    list又称链表,使用一个double linked list(双向串列)来管理元素,它具有不完全的双向链表的功能。

    使用条件:

    包含头文件

    #include<list>

    list类型定义于namespace std中,是个class template:

    namespace std
    {
        template <typename T,
                  typename Allocator = allocator<T> >
        class list;
    }

    list的元素可以是任意类型T,第二个template实参可有可无,用来指定内存模型。默认的内存模型是C++标准库提供的allocator。

    list的能力

    list对象自身提供了两个pointer,或者称为anchor(锚点),用来指向第一个和最末一个元素。而每个元素都有pointer指向前一个和后一个元素。所以一般的操作,都是操纵对应的pointer。

    1.list不支持随机访问,list只有再访问第一个或最末一个元素时速度很快,其他情况下如果你要访问第五个元素,你得先顺着串链逐一爬过前4个元素,这是一种很缓慢的行为。

    2.任何位置上执行元素的安插和移除都是在常量的时间内完成,因为实际上只是进行了一些pointer操作而已。

    3.安插和删除动作并不会造成指向其他元素的各个pointer,reference和iterator失效。

    4.list对于异常操作的反应始终保持 要么操作成功,要么不发生,list的每个元素有他自己的内存。

    list的操作

    1.创建,复制和销毁

    list<elem> c          //default构造函数,产生一个空的list
    list<elem> c(c2)      //copy构造函数,建立c2的同型list并成为c2的一份拷贝
    list<elem> c(n)       //利用元素的default构造函数生成一个大小为n的list
    list<elem> c(n,t)     //建立一个大小为n的list,每个元素值都是t
    list<elem> c(beg,end) //建立一个list,以区间[beg,end)为元素初值
    c.~list()             //销毁所有元素,释放内存

    2.非更易型操作

    c.empty()    //返回是否容器为空
    c.size()     //返回目前元素个数
    c.max_size() //返回元素个数之最大可能量

    3.赋值操作

    c.assign(n,elem)     //复制n个elem,赋值给c
    c.assign(beg,end)    //将区间[beg,end)所有元素赋值给c

    4.元素直接访问

    c.front()  //返回第一个元素
    c.back()   //返回最末元素

    5.迭代器相关函数

    因为不能随机访问元素,所以list提供的迭代器是双向迭代器而非随机访问迭代器。

    c.begin();  //返回一个bidirectional iterator指向第一元素
    c.end();    //返回一个bidirectional iterator指向最末元素的下一位置
    c.rbegin(); //返回一个reverse iterator指向反向迭代的第一元素
    c.rend();   //返回一个reverse iterator指向反向迭代的最末元素的下一位置

    6.元素的安插与移除

    list的成员函数只进行内部pointer操作

    c.push_back(elem)      //附加一个elem的拷贝于末尾
    c.pop_back()           //移除最后一个元素,但是不返回它
    c.push_front(elem)     //在头部插入elem的一个拷贝
    c.pop_front()          //移除第一个元素,但是不返回它
    c.insert(pos,elem)     //在iterator位置pos之前方插入一个elem拷贝,并返回新元素的位置
    c.insert(pos,n,elem)   //在iterator位置pos之前方插入n个elem拷贝,并返回第一个新元素的位置,如果无新元素就返回pos
    c.insert(pos,beg,end)  //在iterator位置pos之前方插入区间[beg,end)内所有元素,并返回第一个新元素的位置,如果无新元素就返回pos
    c.erase(pos)           //移除iterator位置pos上的元素,返回下一元素的位置
    c.erase(beg,end)       //移除区间[beg,end)内的所有元素,返回下一元素的位置
    c.remove(val)          //移除所有值为val的元素
    c.remove_if(op)        //移除所有”造成op(elem)结果为ture“的元素
    c.resize(num)          //将元素数量改为num,如果size()变大,多出的新元素都要以default函数初始化
    c.resize(num,elem)     //将元素数量改为num,如果size()变大,多出新元素都是elem的拷贝
    c.clear()              //移除所有元素,清空容器

    关于remove_if的使用,我们给出一个移除掉所有偶数的实例

    c.remove_if([](int i){
                      return i%2==0;
                          });

    7.list的特殊更易型操作

    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()                    //将所有元素反序
  • 相关阅读:
    Effective.Java第67-77条(异常相关)
    淘宝店的图片哪里来的
    SEO高手在扯蛋?
    多少人,没能熬过那最初的三厘米!
    网站要提高权重要总结三点
    真正的干货是什么?
    google打不开怎么办?谷歌打不开的解决方法
    StatCounter
    教你如何抢注一个快过期的域名
    正确识别希捷Backup Plus新睿品1TB正品,杜绝奸商猖獗
  • 原文地址:https://www.cnblogs.com/cloudplankroader/p/10454330.html
Copyright © 2020-2023  润新知