• C++ STL 之 deque


    deque 和 vector 的最大差异?
    一在于 deque 允许常数时间内对头端进行元素插入和删除操作。
    二在于 deque 没有容量的概念,因为它是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像 vector 那样“因旧空间不足而重新分配一块更大的空间,然后再复制元素,释放空间”这样的操作不会发生在 deque 身上,也因此deque 没有必要提供所谓的空间保留功能。
    特性总结:
     双端插入和删除元素效率较高.
     指定位置插入也会导致数据元素移动,降低效率.
     可随机存取,效率高.
    经验之谈 : deque 是分段连续的内存空间,通过中控器维持一种连续内存空间的状态,其实现复杂性要大于 vector queue stack 等容器,其迭代器的实现也更加复杂,在需要对deque 容器元素进行排序的时候,建议先将 deque 容器中数据数据元素拷贝到 vector 容器中,对 vector 进行排序,然后再将排序完成的数据拷贝回 deque 容器。
      1 #include <iostream>
      2 #include <deque>
      3 using namespace std;
      4 
      5 void PrintDeque(deque<int>& d)
      6 {
      7     for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
      8     {
      9         cout << *it << " ";
     10     }
     11     cout << endl;
     12 }
     13 
     14 // deque 初始化
     15 // deque<T> deqT;//默认构造形式
     16 // deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
     17 // deque(n, elem);//构造函数将 n 个 elem 拷贝给本身。
     18 // deque(const deque &deq);//拷贝构造函数。
     19 void test01()
     20 {
     21     deque<int> d1;
     22     deque<int> d2(10, 5);
     23     deque<int> d3(d2.begin(), d2.end());
     24     deque<int> d4(d3);
     25     PrintDeque(d1);
     26     PrintDeque(d2);
     27     PrintDeque(d3);
     28     PrintDeque(d4);
     29     cout << "------------------" << endl;
     30 }
     31 
     32 // 赋值 大小操作
     33 // assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
     34 // assign(n, elem);//将 n 个 elem 拷贝赋值给本身。
     35 // deque& operator=(const deque &deq); //重载等号操作符
     36 // swap(deq);// 将 deq 与本身的元素互换
     37 
     38 // deque.size();//返回容器中元素的个数
     39 // deque.empty();//判断容器是否为空
     40 // deque.resize(num);//重新指定容器的长度为 num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
     41 // deque.resize(num, elem); //重新指定容器的长度为 num,若容器变长,则以 elem 值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
     42 void test02()
     43 {
     44     deque<int> d1;
     45     deque<int> d2;
     46     deque<int> d3;
     47     d1.assign(10, 5);
     48     d2.assign(d1.begin(), d1.end()); // 迭代器指定区间赋值
     49     d3 = d2;  // 等号赋值
     50     PrintDeque(d1);
     51     PrintDeque(d2);
     52     PrintDeque(d3);
     53     d1.swap(d2); // 交换两个空间元素
     54     if (d1.empty())
     55     {
     56         cout << "空!" << endl;
     57     }
     58     else
     59     {
     60         cout << "size: " << d1.size() << endl;
     61     }
     62     d1.resize(5); // 10个元素,后五个元素扔掉
     63     cout << "------------------" << endl;
     64 }
     65 
     66 // deque 容器插入和删除
     67 // push_back(elem);//在容器尾部添加一个数据
     68 // push_front(elem);//在容器头部插入一个数据
     69 // pop_back();//删除容器最后一个数据
     70 // pop_front();//删除容器第一个数据
     71 void test03()
     72 {
     73     deque<int> d1;
     74     d1.push_back(100);
     75     d1.push_front(200);
     76     d1.push_back(300);
     77     d1.push_back(400);
     78     d1.push_front(500);
     79     PrintDeque(d1);
     80     int val = d1.front(); // 拿到被删除的数据
     81     d1.pop_front();
     82     PrintDeque(d1);
     83     val = d1.back();
     84     d1.pop_back();
     85     PrintDeque(d1);
     86     cout << "------------------" << endl;
     87 }
     88 
     89 // deque 数据存取
     90 // at(idx);//返回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range。
     91 // operator[];//返回索引 idx 所指的数据,如果 idx 越界,不抛出异常,直接出错。
     92 // front();//返回第一个数据。
     93 // back();//返回最后一个数据
     94 
     95 // deque 插入操作
     96 // insert(pos, elem);//在 pos 位置插入一个 elem 元素的拷贝,返回新数据的位置。
     97 // insert(pos, n, elem);//在 pos 位置插入 n 个 elem 数据,无返回值。
     98 // insert(pos, beg, end);//在 pos 位置插入[beg,end)区间的数据,无返回值。
     99 
    100 int main()
    101 {
    102     test01();
    103     test02();
    104     test03();
    105     getchar();
    106     return 0;
    107 }
  • 相关阅读:
    USES_CONVERSION的使用和注意
    UniCode 下 CString 转 char* 的方法
    mfc获取控件在对话框上的位置
    MFC的CListCtrl双击获取单元格的行列
    MFC总结之CListCtrl用法及技巧(二)
    python(19)编码问题
    xpath提取目录下所有标签内的内容,递归 //text()
    Linux命令(14)文件和文件夹权限管理:chmod
    linux命令(13) 删除指定文件夹下后缀名相同的文件
    git(5) windows下 pycharm + git(github) ,在本地方便管理
  • 原文地址:https://www.cnblogs.com/duxie/p/10902019.html
Copyright © 2020-2023  润新知