双端队列(deque)是什么
双端队列(deque)是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,deque类似于vector,
双端队列(deque)属于STL(Standard Template Library, 标准模板库)所以使用的也是也是需要先引入: #include <deque>
双端队列(deque)的初始化
#include <iostream>
#include <string>
using namespace std;
#include <deque>
int main()
{
// 创建一个空的双端队列
deque<int> a;
cout << a.size() << endl;
// 创建一个10个元素对象
deque<int> b(10);
// 创建5个元素且5个元素都为明天
cout << b.size() << endl;
deque<string> c(5, "明天");
for (int i = 0; i < b.size(); i++)
{
cout << c[i] << endl;
}
return 0;
}
双端队列(deque)与向量(vector)比较
双端队列(deque)与向量(vector)多了可在两端进行push、pop但是缺点是占用内存多
(1)如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
(2)如果你需要大量的插入和删除,而不关心随机存取,则应使用list
(3)如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque
双端队列(deque)方法说明
函数 | 说明 |
assign(first,last) | 用迭代器first和last所在元素替换双端队列元素 |
assign(num,val) | 用val的num个副本替换双端队列元素 |
at(n) | 返回双端队列中第n个位置元素的值 |
begin | 双端队列中第一个元素的引用 |
back | 双端队列中最后一个元素的引用 |
size | 返回双端队列的个数 |
front | 获取双端队列中第一个元素 |
end | 获取双端队列中最后一个元素 |
empty | 判断双端队列是否为空,为空返回true |
clear | 清空双端队列元素 |
pop_back | 删除双端队列中最后一个元素 |
pop_front | 删除双端队列中第一个元素 |
rbegin | 返回一个反向迭代器,指向双端队列末尾元素之后 |
rend | 返回一个反向迭代器,指向双端队列起始元素 |
erase(i) | 删除第i位置的元素(注意不能直接为数组,需要用begin或者end) |
erase(start,end) | 删除指定的元素返回,注意是前包含后不包含,里面不能是数字 |
insert(i,x) | 把 i 插入到x位置 |
insert(i,x,y) | 把 i 插入到x到y 的位置 |
swap | 与另一个vector交换数据 |
demo 练习
#include <iostream>
#include <string>
using namespace std;
#include <deque>
int main()
{
// 声明一个string 类型的deque
deque<string> ve;
// 获取默认deque的size
cout << ve.size() << endl;
//在末尾位置添加元素
ve.push_back("赵");
ve.push_back("钱");
ve.push_back("孙");
ve.push_back("李");
// 获取deque的size
cout << ve.size() << endl;
// 开始的位置插入元素
ve.insert(ve.begin(),"百家姓:");
// 结束的位置插入元素
ve.insert(ve.end(),"ok");
//删除指定的元素返回,注意是前包含后不包含,里面不能是数字,
// ve.erase(ve.begin(),ve.begin()+2);
// 删除第二个deque元素
ve.erase(ve.begin()+1);
//删除最后一个元素
ve.pop_back();
// for遍历deque的元素
for (int i = 0; i < ve.size(); i++)
{
cout << ve[i] << endl;
}
//使用迭代器遍历元素
for(deque<string>::iterator it=ve.begin();it!=ve.end();it++){
cout<<*it<<endl;
}
// 获取deque第一个元素
cout << ve.front() << endl;
// 获取deque最后一个元素
cout << ve.back() << endl;
//获取第3个位置的元素
cout << ve.at(2) << endl;
// deque判空
if (ve.empty())
{
cout << "ve为空" << endl;
}
else
{
cout << "ve不为空" << endl;
}
// 清空deque
ve.clear();
return 0;
}