C++优先队列(priority_queue)用法详解

简介: C++优先队列(priority_queue)用法详解

priority_queue


对于这个模板类priority_queue,它是STL所提供的一个非常有效的容器。


作为队列的一个延伸,优先队列包含在头文件 <queue> 中。


优先队列介绍


优先队列是一种比较重要的数据结构,它是有二项队列编写而成的,可以以O(log n) 的效率查找一个队列中的最大值或者最小值,其中是最大值还是最小值是根据创建的优先队列的性质来决定的。


模板 参数


优先队列有三个参数,其声明形式为:


priority_queue< type, container, function >


这三个参数,后面两个可以省略,第一个不可以。


其中:


  • type:数据类型;


  • container:实现优先队列的底层容器;


  • function:元素之间的比较方式;


对于container,要求必须是数组形式实现的容器,例如vector、deque,而不能使list。


在STL中,默认情况下(不加后面两个参数)是以vector为容器,以 operator< 为比较方式,所以在只使用第一个参数时,优先队列默认是一个最大堆,每次输出的堆顶元素是此时堆中的最大元素。


priority_queue成员函数


假设type类型为int,则:


  • bool empty() const


返回值为true,说明队列为空;


  • int size() const


返回优先队列中元素的数量;


  • void pop()


删除队列顶部的元素,也即根节点


  • int top()


返回队列中的顶部元素,但不删除该元素;


  • void push(int arg)


将元素arg插入到队列之中;


大顶堆与小顶堆


大顶堆(降序)


//构造一个空的优先队列(此优先队列默认为大顶堆)
priority_queue<int> big_heap;   
//另一种构建大顶堆的方法
priority_queue<int,vector<int>,less<int> > big_heap2;   


小顶堆(升序)


//构造一个空的优先队列,此优先队列是一个小顶堆
priority_queue<int,vector<int>,greater<int> > small_heap;


注意事项


需要注意的是,如果使用less和greater,需要头文件:


#include <functional>


代码案例



#include<iostream>
#include <queue>
#include<string>
#include<string.h>
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;
}
相关文章
|
24天前
|
存储 算法 编译器
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
234 0
|
27天前
|
存储 JSON 算法
C++ JSON库 nlohmann::basic_json::boolean_t 的用法
C++ JSON库 nlohmann::basic_json::boolean_t 的用法
35 0
|
29天前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— priority_queue(STL)优先队列
本文介绍了C++的STL组件`std::priority_queue`,它是一个容器适配器,实现优先队列数据结构,通常基于堆实现。文章讨论了优先队列的基本概念、特点和底层堆结构,强调了其自动排序和优先级最高元素的访问。还展示了如何定义、插入、访问和移除元素,以及自定义比较函数。此外,提供了模拟实现`priority_queue`的代码示例,探讨了仿函数的作用,包括默认的`std::less`和自定义比较函数。文章鼓励读者进一步探索C++的优先队列及其应用。
25 3
|
16天前
|
人工智能 安全 机器人
【C++】const_cast基本用法(详细讲解)
【C++】const_cast基本用法(详细讲解)
|
16天前
|
人工智能 机器人 中间件
【C++】C++回调函数基本用法(详细讲解)
【C++】C++回调函数基本用法(详细讲解)
|
22天前
|
算法 C++ 容器
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
|
24天前
|
算法 安全 Unix
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
28 0
|
24天前
|
算法 安全 编译器
C++:模版进阶 | Priority_queue的模拟实现
C++:模版进阶 | Priority_queue的模拟实现
|
27天前
|
存储 JSON 算法
C++ JSON库 nlohmann::basic_json::binary_t的用法
C++ JSON库 nlohmann::basic_json::binary_t的用法
23 0
|
28天前
|
算法 编译器 C++
【C++ 泛型编程 进阶篇】:C++ 元模版编程 typename关键字的多种用法全解析
【C++ 泛型编程 进阶篇】:C++ 元模版编程 typename关键字的多种用法全解析
36 0