zoukankan      html  css  js  c++  java
  • 16.4.5 容器种类(外1:7种序列容器类型)

    1.vector模板:

    • 在vector头文件声明
    • ### 在尾部添加和删除元素的时间是固定的,但在头部
    • ### 或中间插入和删除元素的复杂度为线性时间
    • vector是可反转容器概念的模型。由此增加两个类方法:
      1.  rbegin():返回一个指向反转序列的第一个元素的迭代器
      2.     rend():返回反转序列的超尾迭代器

    2.deque模板(双端队列):

    • 在deque头文件种声明
    • ### 在STL中,其实现类似于vector容器,支持随机访问。主要区别在于
    • ### 从deque对象的开始位置插入和删除元素的时间是固定的,而不像vector中那样是线性时间的
    • ### 因此如果多数操作是发生在序列的起始和结尾处,则应考虑使用deque数据结构
    • ### 以上实现的代价是,增加了设计的复杂度,所以尽管二者都提供对元素的随机访问和在序列中部执行线性
    • ### 时间的插入和删除操作,但vector容器执行这些操作时速度要快些

    3.list模板(双向链表):

    • 在list头文件中声明
    • ### list和vector之间关键的区别在于,list在链表中任一位置进行插入和删除的时间都是固定的
    • ### 因此vector强调的是通过随机访问进行快速访问,而list强调的是元素的快速插入和删除
    • 与vector相似,list也是可反转容器
    • 与vector不同的是,list不支持数组表示法和随机访问
    • 与矢量迭代器不同,从容器中插入或删除元素后,链表迭代器指向的元素将不变

    除序列和可反转容器的函数外,list模板类还包含了链表专用的成员函数,部分如下(通常不必担心

    Alloc模板参数,因为它有默认值):

    一些list成员函数

    函数 说明
    void merge(list<T, Alloc> & x)

    将链表x与调用链表合并。两个链表必须已经排序。合并后的经过排序的链表(合并后自动排序)保存在

    调用链表中,x为空。这个函数的复杂度为线性时间

    void remove(const T & val) 从链表中删除val的所有实例。这个函数的复杂度为线性时间
    void sort() 使用<运算符对链表进行排序;N个元素的复杂度为NlogN
    void splice(iterator pos, list<T, Alloc> x) 将链表x的内容插入到pos的前面,x将为空。这个函数的复杂度为固定时间
    void unique() 将连续的相同元素压缩为单个元素。这个函数的复杂度为线性时间

    说明:### 一:insert()和splice()之间的主要区别在于:insert(0将原始区间的副本插入到目标地址,而splice()则将原始区间移动目标地址

               ### 二:splice()方法执行后,迭代器仍有效(指向同一个元素)

               ### 三:使用非成员sort函数需要随机访问迭代器。因快速插入放弃了随机访问功能,所以不能用,转而使用类中的成员版本

    ### sort()、merge()、unique()方法还各自拥有接受另一个参数的版本,该参数用于指定用来比较元素的函数。

    ### remove()方法也有一个接受另一个参数的版本,该参数用于指定用来确定是否删除元素的函数

    ### 上述两个参数都是谓词函数

    4.forward_list模板(单向链):

    • C++11新增
    • 实现单链表:单向,只需要正向迭代器
    • 不可反转

    5.queue模板:

    • 在头文件queue(以前为queue.h)中声明
    • ### 是一个适配器类(ostream_iterator模板也是一个适配器类,让输出流能够使用迭代器接口)
    • ### queue模板让低层类(默认为deque)展示典型的队列接口
    • 限制比deque多:
      •  不允许随机访问
      •     不允许遍历队列
    • ### 它把使用限制在队列的基本操作上
    • ### queue的操作:
      • bool empty() const 如果队列为空,则返回true;否则返回false
        size_type size() const 返回队列中元素的数目
        T & front() 返回指向队首元素的引用
        T & back() 返回指向队尾元素的引用
        void push(const T & x)

        在队尾插入x

        void pop() 删除队首元素
           

    6.priority_queue模板:

    • 在queue头文件中声明,是另一个适配器类
    • 支持的操作与queue相同
    • ### queue与queue的主要区别在于,在priority_queue中,最大的元素被移到队首。
    • ### 内部区别在于,priority_queue默认的底层类是vector

    ### 可以修改用于确定哪个元素放到队首的比较方式,方法是提供一个可选的构造函数参数:

    priority_queue<int> pq1;    // default version
    priority_queue<int> pq2(greater<int>);    // use greater<int> to order

    ### greater<>()函数是一个预定义的函数对象

    7.stack模板(栈):

    • 在头文件stack(以前为stak.h)中声明
    • 与queue相似,它也是一个适配器类,它给底层类(默认为vector)提供了典型的栈接口。
    • 限制多余vector:
      •  不支持随机访问栈元素
      •     不能遍历栈
    • 仅支持栈的基本操作:
      • stack的操作
      • 方法 说明
        bool empty() const 如果栈为空,则返回true;否则则返回false
        size_type size() const 返回栈中的元素数目
        T & top() 返回指向栈顶元素的引用
        void push(const T & x) 在栈顶部插入x
        void pop()

        删除栈顶元素

    array模板(C++11):

    • 在头文件array中定义
    • 非STL容器(原因是长度固定,没有调整大小的操作)
  • 相关阅读:
    tyvj4751 NOIP春季系列课程 H's Problem (树状数组)
    卡牌分组([AtCoder ARC073]Ball Coloring)
    bzoj1036 [ZJOI2008]树的统计Count (树链剖分+线段树)
    bzoj2287 POJ Challenge 消失之物(背包)
    不能建立引用数组
    CString和string的区别
    防止应用程序重复启动
    public,protected,private
    ATL
    c++头文件中定义全局变量
  • 原文地址:https://www.cnblogs.com/suui90/p/13547732.html
Copyright © 2011-2022 走看看