@C++【STL】queue和deque 容器详解
一级目录
二级目录
三级目录
1. 什么是queue容器?
Queue是一种先讲先出( First In First Out,FIFO )的数据结构,它有两个出口。
queue模版类的定义在头文件中。
include
定义queue对象的示例代码如下∶
queue<int>q1;
queue<double>q2;
如图:
2. queue的初始化函数
queue<int>q;
queue<int>q2(q1);
3. queue的相关函数
push(elem); //往队尾添加元素
pop(); //从队头移除元素
back(); //返回最后一个元素
front(); //返回第一个元素
empty(); //判断队列是否为空
size(); // 返回队列大小
案例:
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int>q1;
q1.push(1);
q1.push(2);
q1.push(3);
q1.push(4);
cout<<q1.size()<<endl; //输出队列长度
int first =q1.front();
int end= q1.back();
q1.pop(); //移除首元素
while(!q1.empty())
{
cout<<q1.front()<<" ";
q1.pop();
}
return 0;
}
4. 实践案例
有一堆扑克牌,里面有n张扑克牌。第一次从牌堆顶上拿出一张牌并输出,第二次把牌放回牌堆底下。重复执行直到牌堆里没牌。也就是说奇数张的牌输出,偶数张的牌放回。
输入:
4
1 2 3 4
输出:
1 3 2 4
解析:
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int>q;
int n=0;
cin>>n;
int temp=0;
for(int i=0;i<n;i++)
{
cin>>temp;
q.push(temp);
}
bool flag=1;
while(!q.empty()))
{
if(flag)
{
cout<<q.front()<<" ";
flag=0;
}
else
{
q.push(q.front());
flag=1;
}
q.pop();
}
return 0;
}
4. 什么是deque容器?
deque双端队列,可以对头端和尾端进行插入删除操作。
deque队列为一个给定类型的元素进行线性处理,像向量 一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素。
如图:
5. deque的初始化函数
deque<T> deqT; //默认构造形式
deque(beg, end); //构造函数将[beg,eind]区间中的元素拷贝给本身
deque(n, elem); //构造函数将n个elem拷贝给本身
deque(const deque &deq); //拷贝构造函数
deque<int> a; //该队列为空
deque<int> a1(10); //该队列的大小为10,默认值为0
deque<int> a2(10,1); //该队列的大小为10,默认值为1
deque<int> a3(a2); //拷贝a2
deque<int> a4(a2.begin(),a2.begin()+2);
//将a2在区间[begin,begin+2)的元素赋值给a4,即两个10
6. deque的插入函数
d.push_front(const T& x); //头部添加元素
d.push_back(const T& x); //末尾添加元素
d.insert(iterator it, const T& x); //任意位置插入一个元素
d.insert(iterator it, int n, const T& x); //任意位置插入n个相同元素
d.insert(iterator it, iterator first, iterator last);
//插入另一个向量的[forst,last)间的数据
案例:
#include<iostream>
#include<deque>
using namespace std;
template<class T>
void Print(deque<T> arr)
{
while(!arr.empty())
{
cout<<*(arr.begin())<<endl;
arr.pop_front();
}
cout<<endl;
}
int main()
{
deque<int> d;
d.push_front(4);
d.push_back(3);
Print(d);
deque<int>:: iterator it=d.begin();
d.insert(it,6);
Print(d);
it=d.begin();
d.insert(it,2,8);
Print(d);
deque<int>d1(2,7);
it=d.begin()+1;
d.insert(it,d1.begin(),d1.end());
Print(d);
return 0;
}
7. deque的删除函数
d1.pop_front();
//头部删除元素
d1.pop_back();
//末尾删除元素
d1.erase(iterator it);
//任意位置删除一个元素
d1.erase(iterator first, iterator last)//删除[first,last)之间的元素
d1.clear();
//清空所有元素
案例:
#include<iostream>
#include<deque>
using namespace std;
template<class T>
void Print(deque<T> arr)
{
while(!arr.empty())
{
cout<<*(arr.begin())<<endl;
arr.pop_front();
}
cout<<endl;
}
int main()
{
deque<int>d1;
for(int i=0;i<8;i++)
d1.push_back(i);
Print(d1);
d1.pop_front();
Print(d1);
d1.pop_back();
Print(d1);
deque<int>:: iterator it=d1.begin();
d1.erase(it);
Print(d1);
d1.erase(d1.begin(),d1.begin()+1);
Print(d1);
d1.clear();
Print(d1);
return 0;
}
8. deque的访问函数
下标访问:deq[1];//并不会检查是否越界at方法访问
at: deq.at(1);
//以上两者的区别就是at会检查是否越界,是则抛出out of range异常
//访问第一个元素
deq.front();
//访问最后一个元素
deq.back();
9. deque大小函数
d.size(); //容器大小
d.max_size(); //容器最大容量
d.resize();//更改容器大小
deq.empty();//容器判空
deq.shrink_to_fit();//减少容器大小到满足元素所占存储空间的大小
案例:
#include<iostream>
#include<deque>
using namespace std;
template<class T>
void Print(deque<T> arr)
{
while(!arr.empty())
{
cout<<*(arr.begin())<<endl;
arr.pop_front();
}
cout<<endl;
}
int main()
{
deque<int>d1;
for(int i=0;i<8;i++)
d1.push_back(i);
cout<<d1.size()<<endl;
cout<<d1.max_size()<<endl;
d1.resize(0);
cout<<d1.size()<<endl;
if(d1.empty())
{
cout<<"元素为空"<<endl;
}
return 0;
}
10. deque其他函数
deq.assign(int nSize, const T& x);
//多个元素赋值Ⅱ类似于初始化时用数组进行赋值
swap(deque&); //交换两个同类型容器的元素
案例:
#include<iostream>
#include<deque>
using namespace std;
template<class T>
void Print(deque<T> arr)
{
while(!arr.empty())
{
cout<<*(arr.begin())<<" ";
arr.pop_front();
}
cout<<endl;
}
int main()
{
deque<int>d1;
d1.assign(3,1);
Print(d1);
deque<int>d2;
d2.assign(3,2);
Print(d2);
d1.swap(d2);
Print(d1);
Print(d2);
return 0;
}
11. deque案例
请设计一个排队程序,用户有普通客人和VIP客人之分,VIP客人不排队(即VIP客人在队列头部),请将已有的guest1和guest2放入队列中( guest1排在guest2前),并将VIP客人新增至队列头部。
输入描述:
无
输出描述︰
VIP客人姓名 guest1姓名 guest2姓名(每个客人的名字用空格隔开)
#include<iostream>
#include<deque>
using namespace std;
typedef struct Guest{
string name;
bool Vip;
}Guest;
int main()
{
Guest p={"xiaoming",false};
Guest p1={"xiaohong",false};
Guest p2={"xiaowang",true};
deque<Guest>d;
d.push_back(p);
d.push_back(p1);
d.push_front(p2);
while(!d.empty())
{
cout<<d.front().name<<" ";
d.pop_front();
}
return 0;
}