deque的介绍及使用
1、deque是双端队列,双端队列是动态大小的序列式容器
2、deque是动态数组,允许通过随机访问迭代器直接访问单个元素
3、deque不能保证元素都存储在连续的空间,deque加指针偏移会导致非法
4、deque分布在不同的存储块中
5、deque在头尾进行操作时的效率最高,其他性能较差
1、deque的构造
函数声明 | 接口说明 |
---|---|
deque() 构造空的双端队列 | |
deque(n, val = value_type()) | 用n个值为val的元素构造双端队列 |
deque(InputIterator first, InputIterator last) | 用[first, last)的区间构造双端队列 |
deque(const deque& x) | 双端队列的拷贝构造函数 |
#include <iostream>
#include <deque>
using namespace std;
int main()
{
deque<int> d1;//构造空d1
deque<int> d2(10, 5);//构造10个值为5的d2
for (auto& e : d2)
{
cout << e << " ";
}
cout << endl;
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//用数组区间构造d3
deque<int> d3(arr, arr + sizeof(arr) / sizeof(arr[0]));
for (auto& e : d3)
{
cout << e << " ";
}
cout << endl;
deque<int> d4(d3);//拷贝构造d4
for (auto& e : d4)
{
cout << e << " ";
}
cout << endl;
system("pause");
return 0;
}
2、deque的迭代器
函数声明 | 接口说明 |
---|---|
[begin(), end()()) | begin:容器起始位置 end最后一个元素下一个位置 |
[rbegin(), rend()) | 反向迭代器rbegin在end位置,rend在begin |
[cbegin(), cend()) | const迭代器,与begin和end位置相同,但不能修改其空间内容 |
[crbegin(), crend()) | const反向迭代器,与crbegin在cend位置,crend在cbegin位置 |
#include <iostream>
#include <deque>
using namespace std;
int main()
{
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));
deque<int>::iterator it = d.begin();
while (it != d.end())
{
cout << *it << " ";
it++;
}
cout << endl;
deque<int>::reverse_iterator rit = d.rbegin();
while (rit != d.rend())
{
cout << *rit << " ";
rit++;
}
cout << endl;
system("pause");
return 0;
}
3、deque的基本操作
函数声明 | 接口说明 |
---|---|
size() | 返回deque中有效元素个数 |
empty() | 检测deque是否为空,是返回true,否则返回false |
resize(sz, value) | 将deque中的元素改变到sz,多出的空间用value填充 |
operator[] | 返回deque中n位置上元素的引用 |
front() | 返回deque中首元素的引用 |
back() | 返回deque中最后一个元素的引用 |
push_back() 和 pop_back() | deque的尾插和尾删 |
push_front() 和 pop_front() | deque任意位置插入和删除 |
insert(pos, value) 和 erase(pos) | 删除deque头部元素 |
swap() | 交换两个deque中的内容 |
clear() | 将deque中的元素清空 |
#include <iostream>
#include <deque>
using namespace std;
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));
d.push_back(10);
d.push_front(0);
for (auto& e : d)
{
cout << e << " ";
}
cout << endl;
cout << d.size() << endl;
cout << d.front() << endl;
cout << d.back() << endl;
d.insert(d.begin(), 0);
for (auto& e : d)
{
cout << e << " ";
}
cout << endl;
d.erase(d.begin());
d.pop_back();
d.pop_front();
for (auto& e : d)
{
cout << e << " ";
}
cout << endl;
d.clear();
cout << d.size() << endl;
system("pause");
return 0;
}
4、deque的排序效率问题
注:
deque中排序的效率很低,当对deque排序的时候,需要多次对deque中的元素进行整体遍历,而deque的遍历很低,deque的空间不连续。
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
int arr[] = { 3, 2, 4, 5, 1, 8, 9, 7, 6 };
deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));
for (auto& e : d)
{
cout << e << " ";
}
cout << endl;
sort(d.begin(), d.end());
for (auto& e : d)
{
cout << e << " ";
}
cout << endl;
system("pause");
return 0;
}
5、deque的应用场景
deque的作用是做stack和queue的底层结构