学习笔记 c++ STL标准库#优先队列priority_queue和#队列queue
队列基本思想:先进先出,数组实现方式和此相同,因为栈和队列是一种逻辑结构,数组只是栈和队列的一种实现方式,栈和队列也可以用链表来实现。 |
一、队列 queue
-
1.头文件#include"queue"
-
2.成员函数:
push() //放进数据进入队列,第二次放在第一次之后,以此类推
pop()//删掉队列第一个数值
size()//返回得到一个队列数据个数
empty()//判断该队列是否为空,若为空则返回1
front()//返回得到队列的第一个数值
back()//返回得到队尾的数值 -
以下不常用:
emplace(<类型> T)//在队列尾部追加值a(同类型),和String类的方法函数append(String str)类似
用queue定义的队列放进元素可以是乱序
swap(<类型>队列2 )//交换该队列和队列2
示例:
#include<queue>
#include<iostream>
using namespace std;
int main()
{
int n;//输入个数
cin >> n;
queue<int>num;//定义一个num队列
for (int i = 0; i < n; i++)
{
int tep;
cin >> tep;
num.push(tep);
}
cout << "队列长度=" << num.size() << endl;
cout << "队列第一个数=" << num.front() << " " << "队列最后一个数=" << num.back() << endl;
num.emplace(111);//尾部追加一个值111
cout << "输出队列(先进先出):"<<endl;
while(!num.empty())
{
cout << num.front()<<" ";//依次输出队列元素
num.pop();
}
cout << endl;
queue<int>num2;
num2.push(1);
num2.push(99);
num.swap(num2);//未交换前num队列已经是空
while (!num.empty())
{
cout << num.front() << " ";
num.pop();
}
return 0;
}
输出:
二、优先队列 priority_queue
- 1.头文件#include"queue"
- 2.成员函数:
- 和queue队列比较:成员函数基本相同
增加的函数:top()//得到该队列第一次输入的数值
减少的函数:front()和back()
3.最大区别: 优先队列 priority_queue在输入数值的同时会进行由大到小的顺序即大顶堆 放进队列,队列queue则不会。
定义模板:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。
- priority_queue的默认顺序由大到小,以基本数据类型中的 int 为例:
priority_queue<int >q//
priority_queue<int,vector<int>,less<int> >q //注意“> >”处的空格,
若没有空格则会是右移运算符
以上两个定义方式均是大顶堆
priority_queue<int,vector<int>,greater<int> >q //注意“> >”处的空格
若没有空格则会是右移运算符
以上定义方式为小顶堆(由小到大的优先级)
1)自定义Functional比较方式
priority_queue默认的重载运算符是“<”小于符号
重载运算符:
//结构体内:
struct student
{
string name;
float score;
bool operator<(const student & b) const //必须用const
{
return this.score<b.score;
}
};
//输入的同时就进行比较,定义方式:priority_queue<student> q;
//结构体外:
struct student
{
string name;
float score;
};
struct cmp
{
bool operator()(student s1,student s2)
return s1.score<s2.score;
}
//定义方式:priority_queue<student,vector<student>,cmp> q;
3Q orz !!!