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

    【1】deque容器

    deque 是对 vector 和 list 优缺点的结合,它是处于两者之间的一种容器。

    【2】deque方法集

    应用示例代码:

      1 #include <deque>
      2 #include <iostream>
      3 using namespace std;
      4 
      5 void print(deque<int> & myDeque)
      6 {
      7     int nSize = myDeque.size(); // 返回双向队列中元素的个数
      8     for (int i = 0; i < nSize; ++i)
      9     {
     10         cout << myDeque[i] << " ";
     11     }
     12     cout << endl;
     13 }
     14 
     15 void main()
     16 {
     17     // 构造函数1
     18     deque<int> myDeque1; // 创建一个空的双向队列
     19     // 构造函数2 
     20     deque<int> myDeque2(5); // 创建一个含有5个元素的双向队列 
     21     // 构造函数3
     22     deque<int> myDeque3(5, 15); // 创建一个含有5个元素且值为15的双向队列
     23     // 构造函数4
     24     deque<int> myDeque4(myDeque3); // 创建一个与myDeque3一样的双向队列
     25     // 构造函数5
     26     // 创建一个双向队列,保存myDeque4队列从begin()到end()的元素
     27     deque<int> myDeque5(myDeque4.begin(), myDeque4.end());
     28 
     29     // 索引访问数据元素
     30     // 打印容器中数据元素的值
     31     int nSize = myDeque5.size();
     32     for (int i = 0; i < nSize; ++i)
     33     {
     34         cout << myDeque5[i] << " ";
     35     }
     36     cout << endl;
     37 
     38     // assign 赋值1
     39     myDeque1.assign(myDeque5.begin(), myDeque5.end());
     40     print(myDeque1);
     41     // assign 赋值2
     42     myDeque2.assign(5, 100);
     43     print(myDeque2);
     44 
     45     // at() 返回指定pos的元素(引用)
     46     nSize = myDeque2.size();
     47     for (int i = 0; i < nSize; ++i)
     48     {
     49         cout << myDeque2.at(i) << " ";
     50     }
     51     cout << endl;
     52 
     53     // back() 返回最后一个元素的引用
     54     cout << "back() :: " << myDeque2.back() << endl;
     55 
     56     // clear() 清除所有元素
     57     myDeque2.clear();
     58 
     59     // empty() 判空
     60     cout << "empty() :: " << myDeque2.empty() << endl;
     61 
     62     // erase 删除元素1
     63     myDeque1.erase(myDeque1.begin());
     64     print(myDeque1);
     65     // erase 删除元素2
     66     myDeque1.erase(myDeque1.begin(), myDeque1.end());
     67     print(myDeque1);
     68 
     69     // front() 返回第一个元素的引用
     70     cout << "front() :: " << myDeque3.front() << endl;
     71 
     72     // get_allocator() 返回双向队列的配置器
     73     // 1、用内存分配器分配包含5个元素的数组
     74     int* p = myDeque1.get_allocator().allocate(5);
     75  
     76     // 2、构造数组中的每个元素:
     77     for (int i = 0; i < 5; ++i) 
     78     {
     79         myDeque1.get_allocator().construct(&p[i], i);
     80     }
     81  
     82     cout << "当前数组:";
     83     for (int i = 0; i < 5; ++i) 
     84         cout << " " << p[i];
     85     cout << endl;
     86  
     87     // 3、析构及释放内存:
     88     for (int i = 0; i < 5; ++i) 
     89     {
     90         myDeque1.get_allocator().destroy(&p[i]);
     91     }
     92 
     93     myDeque1.get_allocator().deallocate(p, 5);
     94 
     95     // insert 插入一个元素到双向队列中
     96     myDeque1.insert(myDeque1.begin(), 6, 66);
     97     print(myDeque1);
     98     myDeque3.insert(myDeque3.begin(), myDeque1.begin(), myDeque1.end());
     99     print(myDeque3);
    100 
    101     // max_size() 返回双向队列可以容纳的最大元素个数
    102     cout << "max_size() :: " << myDeque2.max_size() << endl;
    103 
    104     // push_front() 在头部添加一个元素
    105     // push_back() 在尾部添加一个元素
    106     // pop_front() 删除头部的元素
    107     // pop_back() 删除尾部的元素
    108     for (int i = 0; i < 10; ++i)
    109     {
    110         int nRandValue = rand() % 100;
    111         if (nRandValue % 2 == 0)
    112         {
    113             myDeque2.push_front(nRandValue);
    114         }
    115         else
    116         {
    117             myDeque2.push_front(nRandValue);
    118         }
    119     }
    120     print(myDeque2);
    121     myDeque2.pop_back(); // 删除尾部元素
    122     cout << "pop_back()后 ";
    123     print(myDeque2);
    124     myDeque2.pop_front(); // 删除头部元素
    125     cout << "pop_front()后 ";
    126     print(myDeque2);
    127 
    128     // swap() 和另一个双向队列交换元素
    129     cout << "交换前:" << endl;
    130     cout << "双向队列1数据元素:";
    131     print(myDeque1);
    132     cout << "双向队列2数据元素:";
    133     print(myDeque2);
    134     myDeque1.swap(myDeque2);
    135     cout << "交换后:" << endl;
    136     cout << "双向队列1数据元素:";
    137     print(myDeque1);
    138     cout << "双向队列2数据元素:";
    139     print(myDeque2);
    140 
    141     // resize() 改变双向队列的大小
    142     myDeque1.resize(5);
    143     cout << "双向队列1 重置大小为resize(5) :: " ;
    144     print(myDeque1);
    145 
    146     system("pause"); 
    147 }
    148 
    149 // run out:
    150 /*
    151 15 15 15 15 15
    152 15 15 15 15 15
    153 100 100 100 100 100
    154 100 100 100 100 100
    155 back() :: 100
    156 empty() :: 1
    157 15 15 15 15
    158 
    159 front() :: 15
    160 当前数组: 0 1 2 3 4
    161 66 66 66 66 66 66
    162 66 66 66 66 66 66 15 15 15 15 15
    163 max_size() :: 1073741823
    164 64 62 58 78 24 69 0 34 67 41
    165 pop_back()后 64 62 58 78 24 69 0 34 67
    166 pop_front()后 62 58 78 24 69 0 34 67
    167 交换前:
    168 双向队列1数据元素:66 66 66 66 66 66
    169 双向队列2数据元素:62 58 78 24 69 0 34 67
    170 交换后:
    171 双向队列1数据元素:62 58 78 24 69 0 34 67
    172 双向队列2数据元素:66 66 66 66 66 66
    173 双向队列1 重置大小为resize(5) :: 62 58 78 24 69
    174 请按任意键继续. . .
    175 */

    【3】deque总结

    deque是介于数组和链表之间,它兼顾了数组和链表的优点,它是分块的链表和多个数组的联合。

    所以它有比list好的查询性能,有比vector好的插入、删除性能。

    如果你需要随机存取又关心两端数据的插入和删除,那么deque是最佳之选。

    Good  Good  Study,  Day  Day   Up.

    顺序  选择  循环  总结

  • 相关阅读:
    Spring中使用Log4j记录日志
    Spring MVC异常处理实例
    Spring MVC静态资源实例
    Spring MVC页面重定向实例
    Spring MVC表单实例
    Eclipse4.6安装Tomcat插件时报错:Unable to read repository at http://tomcatplugin.sf.net/update/content.xml. Received fatal alert: handshake_failure
    Graphviz--图形绘制工具
    使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境
    MySQL在并发场景下的问题及解决思路
    MIT KIT OpenID Connect Demo Client
  • 原文地址:https://www.cnblogs.com/Braveliu/p/6272411.html
Copyright © 2011-2022 走看看