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.

顺序  选择  循环  总结

posted @ 2017-01-11 09:35  kaizenly  阅读(474)  评论(0编辑  收藏  举报
打赏