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

    deque简介

    deque属于序列式容器,和vector十分相似,采用dynamic array来管理元素,提供随机访问,但是deque的dynamic array头尾两端都开放,可以在头尾两端快速安插和删除。

    为了提供这种能力,deque通常实现为一组独立区块,第一区块朝某方向发展,最末区块朝另一方向发展。

    使用条件:

    包含头文件

    #include<deque>

    deque类型定义于命名空间std内的一个class template

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

    这里的第一个template参数用来表明元素类型,第二个template实参可有可无,用来指定内存模型,默认为allocator。

    deque的能力

    1.能够在两端快速安插和移除元素,这些操作可以在摊提的常量时间内完成,但在中段安插和移除元素的速度相对较慢。

    2.访问元素时deque内部结构会多一个间接过程,所以元素的访问和迭代器的动作会稍稍慢一些呢。

    3.在PC这样的内存区块有大小限制的系统中,deque使用不止一块内存,所以可以内含更多元素,因此deque的max_size()可能更大哦。

    4.deque的迭代器是随机访问迭代器。

    deque操作函数

    1.构造函数和析构函数

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

    注意:deque因为内存区块的问题,不提供容量操作

    2.非更易型操作

    c.empty()          //返回容器是否为空
    c.size()           //返回目前的元素个数
    c.max_size()       //返回元素个数之最大可能量
    c.shrink_to_fit()  //要求降低容量,以符合元素个数
    c[id]              //返回索引id指向的元素,不检查范围
    c.at(id)           //返回索引id指向的元素,如果超出范围就跑出range-error异常
    c.front()          //返回第一元素
    c.back()           //返回最末元素
    c.begin()          //返回一个迭代器指向第一元素
    c.end()            //返回一个迭代器指向最末元素的下一位置
    c.rbegin()         //返回一个反向迭代器指向反向迭代的第一元素
    c.rend()           //返回一个反向迭代器指向反向迭代的最末元素的下一位置

    3.更易型操作

    c=c2                   //将c2的全部元素赋给c
    c.push_back(elem)      //附加一个elem的拷贝于末尾
    c.pop_back()           //移除最后一个元素,但是不返回它
    c.push_front(elem)     //在头部插入一个elem的拷贝
    c.pop_front()          //移除第一个元素,但是不返回它
    c.assign(n,elem)       //复制n个elem,赋值给c
    c.assign(beg,end)      //将区间[beg,end)所有元素赋值给c
    c.insert(pos,elem)     //在iterator位置pos之前方插入一个elem拷贝,并返回新元素的位置
    c.insert(pos,n,elem)   //在ierator位置pos之前方插入n个elem拷贝,并返回第一个新元素的位置,若没有元素,则返回pos
    c.insert(pos,beg,end)  //在ierator位置pos之前方插入区间[beg,end)内所有元素的拷贝,并返回第一个新元素的位置,若没有元素,则返回pos
    c.erase(pos)           //移除iterator位置pos上的元素,返回下一个元素的位置
    c.erase(beg,end)       //移除区间[beg,end)内的所有元素,返回下一个元素的位置
    c.resize(num)          //将元素数量改为num,如果size()变大,多出的新元素都要以default函数初始化
    c.resize(num,elem)     //将元素数量改为num,如果size()变大,多出新元素都是elem的拷贝
    c.clear()              //移除所有元素,清空容器

    注意:在deque为空的情况下,assgin()和insert()我们建议使用前者。

    deque的操作并不复杂,在以下情形中最好采用deque:

    • 需要在两端安插和移除元素(毕竟双端队列)
    • 无需指向容器内的元素
    • 要求不再使用的元素必须释放
  • 相关阅读:
    怎么查看京东店铺的品牌ID
    PPT编辑的时候很卡,放映的时候不卡,咋回事?
    codevs 1702素数判定2
    codevs 2530大质数
    codevs 1488GangGang的烦恼
    codevs 2851 菜菜买气球
    hdu 5653 Bomber Man wants to bomb an Array
    poj 3661 Running
    poj 1651 Multiplication Puzzle
    hdu 2476 String Painter
  • 原文地址:https://www.cnblogs.com/cloudplankroader/p/10447979.html
Copyright © 2011-2022 走看看