学习笔记 c++ STL标准库#优先队列priority_queue和#队列queue

学习笔记 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 !!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值