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.
顺序 选择 循环 总结