STL容器之deque

时间:2023-03-09 08:28:32
STL容器之deque

【1】deque容器

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

【2】deque方法集

应用示例代码:

 #include <deque>
#include <iostream>
using namespace std; void print(deque<int> & myDeque)
{
int nSize = myDeque.size(); // 返回双向队列中元素的个数
for (int i = ; i < nSize; ++i)
{
cout << myDeque[i] << " ";
}
cout << endl;
} void main()
{
// 构造函数1
deque<int> myDeque1; // 创建一个空的双向队列
// 构造函数2
deque<int> myDeque2(); // 创建一个含有5个元素的双向队列
// 构造函数3
deque<int> myDeque3(, ); // 创建一个含有5个元素且值为15的双向队列
// 构造函数4
deque<int> myDeque4(myDeque3); // 创建一个与myDeque3一样的双向队列
// 构造函数5
// 创建一个双向队列,保存myDeque4队列从begin()到end()的元素
deque<int> myDeque5(myDeque4.begin(), myDeque4.end()); // 索引访问数据元素
// 打印容器中数据元素的值
int nSize = myDeque5.size();
for (int i = ; i < nSize; ++i)
{
cout << myDeque5[i] << " ";
}
cout << endl; // assign 赋值1
myDeque1.assign(myDeque5.begin(), myDeque5.end());
print(myDeque1);
// assign 赋值2
myDeque2.assign(, );
print(myDeque2); // at() 返回指定pos的元素(引用)
nSize = myDeque2.size();
for (int i = ; i < nSize; ++i)
{
cout << myDeque2.at(i) << " ";
}
cout << endl; // back() 返回最后一个元素的引用
cout << "back() :: " << myDeque2.back() << endl; // clear() 清除所有元素
myDeque2.clear(); // empty() 判空
cout << "empty() :: " << myDeque2.empty() << endl; // erase 删除元素1
myDeque1.erase(myDeque1.begin());
print(myDeque1);
// erase 删除元素2
myDeque1.erase(myDeque1.begin(), myDeque1.end());
print(myDeque1); // front() 返回第一个元素的引用
cout << "front() :: " << myDeque3.front() << endl; // get_allocator() 返回双向队列的配置器
// 1、用内存分配器分配包含5个元素的数组
int* p = myDeque1.get_allocator().allocate(); // 2、构造数组中的每个元素:
for (int i = ; i < ; ++i)
{
myDeque1.get_allocator().construct(&p[i], i);
} cout << "当前数组:";
for (int i = ; i < ; ++i)
cout << " " << p[i];
cout << endl; // 3、析构及释放内存:
for (int i = ; i < ; ++i)
{
myDeque1.get_allocator().destroy(&p[i]);
} myDeque1.get_allocator().deallocate(p, ); // insert 插入一个元素到双向队列中
myDeque1.insert(myDeque1.begin(), , );
print(myDeque1);
myDeque3.insert(myDeque3.begin(), myDeque1.begin(), myDeque1.end());
print(myDeque3); // max_size() 返回双向队列可以容纳的最大元素个数
cout << "max_size() :: " << myDeque2.max_size() << endl; // push_front() 在头部添加一个元素
// push_back() 在尾部添加一个元素
// pop_front() 删除头部的元素
// pop_back() 删除尾部的元素
for (int i = ; i < ; ++i)
{
int nRandValue = rand() % ;
if (nRandValue % == )
{
myDeque2.push_front(nRandValue);
}
else
{
myDeque2.push_front(nRandValue);
}
}
print(myDeque2);
myDeque2.pop_back(); // 删除尾部元素
cout << "pop_back()后 ";
print(myDeque2);
myDeque2.pop_front(); // 删除头部元素
cout << "pop_front()后 ";
print(myDeque2); // swap() 和另一个双向队列交换元素
cout << "交换前:" << endl;
cout << "双向队列1数据元素:";
print(myDeque1);
cout << "双向队列2数据元素:";
print(myDeque2);
myDeque1.swap(myDeque2);
cout << "交换后:" << endl;
cout << "双向队列1数据元素:";
print(myDeque1);
cout << "双向队列2数据元素:";
print(myDeque2); // resize() 改变双向队列的大小
myDeque1.resize();
cout << "双向队列1 重置大小为resize(5) :: " ;
print(myDeque1); system("pause");
} // run out:
/*
15 15 15 15 15
15 15 15 15 15
100 100 100 100 100
100 100 100 100 100
back() :: 100
empty() :: 1
15 15 15 15 front() :: 15
当前数组: 0 1 2 3 4
66 66 66 66 66 66
66 66 66 66 66 66 15 15 15 15 15
max_size() :: 1073741823
64 62 58 78 24 69 0 34 67 41
pop_back()后 64 62 58 78 24 69 0 34 67
pop_front()后 62 58 78 24 69 0 34 67
交换前:
双向队列1数据元素:66 66 66 66 66 66
双向队列2数据元素:62 58 78 24 69 0 34 67
交换后:
双向队列1数据元素:62 58 78 24 69 0 34 67
双向队列2数据元素:66 66 66 66 66 66
双向队列1 重置大小为resize(5) :: 62 58 78 24 69
请按任意键继续. . .
*/

【3】deque总结

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

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

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

Good  Good  Study,  Day  Day   Up.

顺序  选择  循环  总结