c++优先队列用法知识点总结

c++优先队列用法详解

优先队列也是队列这种数据结构的一种。它的操作不仅局限于队列的先进先出,可以按逻辑(按最大值或者最小值等出队列)。

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。

首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。

优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

和队列基本操作相同:

top 访问队头元素

empty 队列是否为空

size 返回队列内元素个数

push 插入元素到队尾 (并排序)

emplace 原地构造一个元素并插入队列

pop 弹出队头元素

swap 交换内容

定义:priority_queue<Type, Container, Functional>

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。

当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。

一般是:

//升序队列

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

//降序队列

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

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

1、基本类型优先队列的例子:

#include<iostream>

#include <queue>

using namespace std;

int main() 

{

  //对于基础类型 默认是大顶堆

  priority_queue<int> a; 

  //等同于 priority_queue<int, vector<int>, less<int> > a;

  //   这里一定要有空格,不然成了右移运算符↓↓

  priority_queue<int, vector<int>, greater<int> > c; //这样就是小顶堆

  priority_queue<string> b;

  for (int i = 0; i < 5; i++) 

  {

    a.push(i);

    c.push(i);

  }

  while (!a.empty()) 

  {

    cout << a.top() << ' ';

    a.pop();

  } 

  cout << endl;

  while (!c.empty()) 

  {

    cout << c.top() << ' ';

    c.pop();

  }

  cout << endl;

  b.push("abc");

  b.push("abcd");

  b.push("cbd");

  while (!b.empty()) 

  {

    cout << b.top() << ' ';

    b.pop();

  } 

  cout << endl;

  return 0;

}

运行结果:

4 3 2 1 0

0 1 2 3 4

cbd abcd abc

请按任意键继续. . .

2、用pair做优先队列元素的例子:

规则:pair的比较,先比较第一个元素,第一个相等比较第二个。

#include <iostream>

#include <queue>

#include <vector>

using namespace std;

int main() 

{

  priority_queue<pair<int, int> > a;

  pair<int, int> b(1, 2);

  pair<int, int> c(1, 3);

  pair<int, int> d(2, 5);

  a.push(d);

  a.push(c);

  a.push(b);

  while (!a.empty()) 

  {

    cout << a.top().first << ' ' << a.top().second << '\n';

    a.pop();

  }

}

运行结果:

2 5

1 3

1 2

请按任意键继续. . .

3、用自定义类型做优先队列元素的例子

#include <iostream>

#include <queue>

using namespace std;

//方法1

struct tmp1 //运算符重载<

{

  int x;

  tmp1(int a) {x = a;}

  bool operator<(const tmp1& a) const

  {

    return x < a.x; //大顶堆

  }

};

//方法2

struct tmp2 //重写仿函数

{

  bool operator() (tmp1 a, tmp1 b) 

  {

    return a.x < b.x; //大顶堆

  }

};

int main() 

{

  tmp1 a(1);

  tmp1 b(2);

  tmp1 c(3);

  priority_queue<tmp1> d;

  d.push(b);

  d.push(c);

  d.push(a);

  while (!d.empty()) 

  {

    cout << d.top().x << '\n';

    d.pop();

  }

  cout << endl;

  priority_queue<tmp1, vector<tmp1>, tmp2> f;

  f.push(b);

  f.push(c);

  f.push(a);

  while (!f.empty()) 

  {

    cout << f.top().x << '\n';

    f.pop();

  }

}

运行结果:

3

2

1

3

2

1

请按任意键继续. . .

以上就是c++优先队列用法详解的详细内容,如果大家有任何补充可以联系我们小编。

(0)

相关推荐

  • c++优先队列用法知识点总结

    c++优先队列用法详解 优先队列也是队列这种数据结构的一种.它的操作不仅局限于队列的先进先出,可以按逻辑(按最大值或者最小值等出队列). 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除. 在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, largest out)的行为特征. 首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队

  • python的launcher用法知识点总结

    python launcher是适用于 Windows 的 Python 启动器,可帮助您定位和执行不同的 Python 版本.它允许脚本(或命令行)为特定的 Python 版本指示首选项,定位并执行该版本. 不同于 PATH 变量,Python Launcher 将正确选择最合适的 Python 版本.它更喜欢每个用户在系统范围内的安装,并且运行指定的 Python 版本,而不是使用最近安装的版本. python2.7文件头 #! python2.7 import sys print(sys.

  • C++优先队列用法案例详解

    c++优先队列(priority_queue)用法详解 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除. 在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, largest out)的行为特征. 首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队. 优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上

  • java关键字final用法知识点

    inal:最终的,确保使用前是被赋值得,一旦赋值后不可修改. 1 数据 ①局部变量 基本数据类型: 可以先定义后赋值,但要保证在使用前是已被赋值的,一旦赋值后不可修改: 引用数据类型: 可以先定义后赋值,但要保证在使用前是已被赋值的,一旦赋值后不可修改: 引用内容不可修改,但备用用的对象内容可以被修改: ②成员变量 必须保证成员变量在使用前被赋值: 成员变量赋值的方式有两种,1声明变量时赋值,2构造函数中赋值: public static void main(String[] args) { /

  • python进程和线程用法知识点总结

    今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持"多任务"的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的体验.因此在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的"并发编程",应该是程序员必备技能之一.为此,我们需要先讨论两个概念,一个叫进程,一个叫线程. 概念 进程就是操作系统中执行的一个程序,操作

  • MySql 知识点之事务、索引、锁原理与用法解析

    本文实例讲述了MySql 知识点之事务.索引.锁原理与用法.分享给大家供大家参考,具体如下: 事务 事务概念 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎执行一组操作语句,那么久执行所有的操作,如果其中有任何一条崩溃或其他原因无法执行,所有语句将不会执行.也就是说事务内的语句,要么全部执行成功,要么全部执行失败. 事务特性ACID 原子性(atomicity) 一个事务被视为最小工作单元,不可拆分,整个事务所有的操作要么全部提交成功,要么全部失败回滚,不可只执行部分.

  • TypeScript高级用法的知识点汇总

    引言 作为一门强大的静态类型检查工具,如今在许多中大型应用程序以及流行的JS库中均能看到TypeScript的身影.JS作为一门弱类型语言,在我们写代码的过程中稍不留神便会修改掉变量的类型,从而导致一些出乎意料的运行时错误.然而TypeScript在编译过程中便能帮我们解决这个难题,不仅在JS中引入了强类型检查,并且编译后的JS代码能够运行在任何浏览器环境,Node环境和任何支持ECMAScript 3(或更高版本)的JS引擎中.最近公司刚好准备使用TypeScript来对现有系统进行重构,以前

  • java优先队列PriorityQueue中Comparator的用法详解

    在使用java的优先队列PriorityQueue的时候,会看到这样的用法. PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2){ return o1.compareTo(o2); } }); 那这样到底构造的是最大优先还是最小优先队列呢? 看看源码

  • Python装饰器用法与知识点小结

    本文实例讲述了Python装饰器用法与知识点.分享给大家供大家参考,具体如下: (1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func): def done(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print('the func run time is %s' % (stop_time

  • PHP数组基本用法与知识点总结

    本文实例讲述了PHP数组基本用法与知识点.分享给大家供大家参考,具体如下: 初识数组 概念: 数组就是一个可以存储一组或一系列数值的变量 数组组成: 数组是由一个或多个数组元素组成的 数组元素: 一每个数组由键(Key)和值(Value)构成 键: "键"为元素的是被名称,也被称为数组下标 值: "值"为元素的内容 映射:"键"和"值"之间存在一种对应关系,称之为映射 类型划分: 根据键的数据类型,可以将数组划分为索引数组和关

随机推荐