STL——queue、priority_queue、deque

queue(队列)

一种先进先出的数据结构

1、头文件
#include<queue>
using namespace std;

2、定义
queue<int>qu;
queue<int>qu[manx];//qu[0]~qu[manx-1]中的每一个都是一个容器
queue<queue<int> >qu;//>>之间要加空格
//类型名也可以是int、double、char,或者STL标准容器:vector、queue等

3、访问
在STL的queue中只能通过front()来访问栈顶元素

4、常用函数(见表格)

5、示例(见代码)

6、用途
当需要实现广度优先搜索时,可以用queue代替手动实现队列,提高程序的准确性
基本操作 复杂度
push() push(x)表示将x入队 O(1)
front() 获得队首元素 O(1)
back() 获得队尾元素 O(1)
pop() 移除栈顶元素 O(1)
empty() 检测queue是否为空,为true空返回 O(1)
size() 返回queue中元素的个数 O(1)
#include<algorithm>
#include<stdio.h>
#include <iostream>
#include<queue>
using namespace std;
queue<int>qu;
int main()
{
    qu.push(12);//加入队列
    qu.push(1);
    qu.push(5);
    qu.push(9);
    cout<<qu.size()<<endl;
    while(!qu.empty())//非空
    {
        printf("%d ",qu.front());//队首
        qu.pop();//弹出
    }
    cout<<endl;
}

在这里插入图片描述

补充:另外两种与队列有关的容器

priority_queue(优先队列)

使用堆实现的默认将当前队列优先级最高的元素置于队首的容器

1、与queue的区别:

(1)定义:priority_queue< int >qu;
(2)访问:优先队列没有front()和back()函数,只能通过back访问队首元素

2、示例:

#include<algorithm>
#include<stdio.h>
#include <iostream>
#include<queue>
using namespace std;
priority_queue<int>qu;
int main()
{
    qu.push(12);//加入队列
    qu.push(1);
    qu.push(5);
    qu.push(9);
    cout<<qu.size()<<endl;
    while(!qu.empty())//非空
    {
        printf("%d ",qu.top());//队首
        qu.pop();//弹出
    }
    cout<<endl;
}

在这里插入图片描述

3、priority_queue内元素优先级设置

(1)基本数据类型的优先级设置(int、double、char等)
less< int >表示数字大的有优先级越大,greater< int >相反

这两种定义时等价的

priority_queue<int>qu;
priority_queue<int,vector<int>,less<int> >qu;

如果想让优先队列总是把最小的元素放队首,则定义如下

priority_queue<int,vector<int>,greater<int> >qu;

(2)结构体的优先级设置
重载小于号

struct node
{
     char name[10];
     int age;
     int heigth;
     friend bool operator<(node a,node b)//重载小于号“<”
    {
        return a.age>b.age;//年龄小的优先级高
    }
};
sort(line,line+n);
priority_queue<node>qu;

写在外面:用struct包装一个cmp函数

struct node
{
     char name[10];
     int age;
     int heigth;
};
struct cmp
{
   bool operator()(node a,node b)//friend去掉,“<”换成“()”
   {
        return a.age>b.age;
   }
}
sort(line,line+n,cmp());
priority_queue<node,vector<node>,cmp>qu;

或:

struct node
{
     char name[10];
     int age;
     int heigth;
};
bool operator<(node a,node b)
{
    return a.age<b.age;
}
sort(line,line+n);
priority_queue<node>qu;

注:当结构体内数据较为庞大时,建议用引用来提高效率,即比较类的参数中加上const和&

friend bool operator<(const node &a,const node &b)

bool operator()(const node &a,const node &b)

4、用途
(1)解决一些贪心问题
(2)优化Dijkstra算法

deque

示例:

#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
deque<int>dq;
int main()
{
    dq.push_back(1);
    dq.push_back(2);
    dq.push_back(3);//插入队尾
    dq.push_front(0);//插入队首
    while(!dq.empty())
    {
        printf("%d ",dq.front());//首
        dq.pop_front();//pop首
    }
    printf("\n");
    dq.push_back(1);
    dq.push_back(2);
    dq.push_back(3);
    dq.push_front(0);
    while(!dq.empty())
    {
        printf("%d ",dq.back());//尾
        dq.pop_back();//pop尾
    }
}

在这里插入图片描述

发布了52 篇原创文章 · 获赞 26 · 访问量 3178

猜你喜欢

转载自blog.csdn.net/qq_43803508/article/details/99084936