• [C++标准模板库:自修教程与参考手册]关于deque


    Deque的基本概念

    deque和vector很相似,也提供随机存取的能力,将元素都动态地存储在一个数组中,最大的区别就是:deque的头和尾都是开放的,非常方便在头尾两端进行一些操作。(重点在于:deque所占用的内存区域不是连续的一块区域,可能是多块内存区域,就像数据结构中的邻接表一样,表中每一个指针指向一块内存区域的起始地址,它采用一个map(不是STL中的map)作为主要控制,每个元素都是一个指针,指向一个缓冲区,这个缓冲区才是真正的存储区(SGI STL允许指定默认的单个缓冲区大小,默认是512byte),从概念上来讲是这样,所以deque的迭代器也比较特别,因为进行地址的自增操作,需要可能会发生内存区域的跨越,这样消耗的时间会比别的迭代器要慢上一些
    这里写图片描述

    deque和vector的一些区别

    1. deque可以很快速的在头尾两端进行插入和删除操作,这些都能在O(1)的时间内完成。
    2. 存取元素时,迭代器的计算会多一些地址上的计算,所以可能会慢一些。
    3. 迭代器需要在不同的内存区域上跳转,所以需要特别的智能指针,而不是一般的指针。
    4. deque不含有对容量和内存重新分配的函数,不过deque的内存重新分配机制比vector的要好,因为它不会在内存重新分配的时候重新复制所有元素(只需要重新赋值部分内存区域上的元素,而不是全部,这个被重新赋值的区域是连续的
    5. 在中间进行插入的时间还是较慢,因为还是需要移动元素。
    6. c.at(idx)会进行范围检查,而c[idx]不会,所以最好使用前者而不是后者

    vector和deque的差别表面上看起来并不大,但是其deque的元素赋值实因为deque内部空间并不是完全连续的,所以针对deque的算法,迭代器的复杂程度都是vector所无法相比的,因此能使用vector的情况下就尽量使用vector,而且针对deque的排序操作,可以将deque的元素先复制到vector中,用sort排序之后再复制回去,这样效率会更加高。

    deque一些常用的函数

    //产生一个空的deque
    deque<elem> c;
    //用c2来赋值c1
    deque<elem> c1(c2);
    //产生一个deque,其中含有n个元素,均以默认构造函数产生
    deque<elem> c1(n);
    //销毁所有元素,释放内存
    c.~deque<elem>();
    //返回容器的实际元素个数
    c.size();
    //判断容器大小是为空
    c.empty();
    //返回可容纳的最大元素数量
    c.max_size();
    //返回idx所指向位置的元素,如果超出范围,会抛出异常out_range
    c.at(idx);
    //返回idx所指向位置的元素,不进行返回检查
    c[idx];
    //返回c第一个的元素,不进行范围检查
    c.front();
    //返回c最后一个元素,不进行范围检查
    c.end();
    //将c1和c2的元素互换
    c1.swap(c2);
    //移除所有元素,将deque清空
    c1.clear();
    //从头部插入元素
    c.push_front();
    //从尾部插入元素
    c.push_back();
    //删除头部元素,不返回
    c.pop_front();
    //删除尾部元素,不返回
    c.pop_back();
    
    
    https://github.com/li-zheng-hao
  • 相关阅读:
    第十一次作业——LL(1)文法
    wechall前十题
    [V&N2020 公开赛]TimeTravel 复现
    CTFHub web技能树之RCE初步 命令注入+过滤cat
    算法第四章作业
    算法第四章上机实践报告
    算法第三章作业
    算法第三章上机实践报告
    算法--第二章作业
    算法第二章上机报告
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053714.html
Copyright © 2020-2023  润新知