C++【STL】queue和deque 容器详解

文章详细介绍了C++STL中的queue和deque容器。queue是FIFO(先进先出)数据结构,提供了push、pop、front和back等操作。deque是双端队列,支持在头部和尾部的插入和删除,具有快速访问和高效插入删除的特点。文中还给出了多个使用这两个容器的实例,包括扑克牌案例和VIP客人排队案例。
摘要由CSDN通过智能技术生成

@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;

}

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值