priority_queue 模拟实现

简介: priority_queue 模拟实现

priority_queue(优先队列)是一种特殊的队列数据结构,它的每个元素都有一个与之关联的优先级。在优先队列中,元素按照优先级的顺序进行排列,具有较高优先级的元素排在前面,较低优先级的元素排在后面。

C++标准库中的priority_queue:

priority_queue

下面是riority_queue的简单模拟实现:

#pragma once
#include <vector>
#include <iostream>
using namespace std;
namespace hsl
{
  template<class T, class Container = vector<T>,class Compar = Less<T>>
  class priority_queue
  {
  public:
    priority_queue()
    {}
    template <class InputIterator>
    priority_queue(InputIterator first, InputIterator last)
      :_con(first, last)
    {
      for (int i = (_con.size() - 2) / 2; i >= 0; i--)
      {
        adjust_down();
      }
    }
    void adjust_up(int child)
    {
      Compar com;
      int parent = (child - 1) / 2;
      while (child > 0)
      {
        //if (_con[parent] < _con[child])
        if(com(_con[parent],_con[child]))
        {
          swap(_con[parent], _con[child]);
          child = parent;
          parent = (child - 1) / 2;
        }
        else
        {
          break;
        }
      }
    }
    void adjust_down(size_t parent)
    {
      Compar com;
      size_t child = parent * 2 + 1;
      while (child < _con.size())
      {
        if (child + 1 < _con.size() && com(_con[child] , _con[child + 1]))
        {
          ++child;
        }
        if (com(_con[parent] , _con[child]))
        {
          swap(_con[parent], _con[child]);
          parent = child;
          child = parent * 2 + 1;
        }
        else
        {
          break;
        }
      }
    }
    void push(const T& x)
    {
      _con.push_back(x);
      adjust_up(_con.size()-1);
    }
    void pop()
    {
      swap(_con[0], _con[_con.size() - 1]);
      _con.pop_back();
      adjust_down(0);
    }
    const T& top()
    {
      return _con[0];
    }
    bool empty()
    {
      return _con.empty();
    }
    size_t size()
    {
      return _con.size();
    }
  private:
    Container _con;
  };
  template<class T>
  class Less
  {
  public:
    const T& operator()(const T& a, const T& b)
    {
      return a < b;
    }
  };
  template<class T>
  class Greater
  {
  public:
    const T& operator()(const T& a, const T& b)
    {
      return a > b;
    }
  };
}
相关文章
|
Java 数据库 数据安全/隐私保护
【Java面试】谈谈你对自定义类加载器的理解
【Java面试】谈谈你对自定义类加载器的理解
559 0
|
Shell
Ubuntu20.04安装anaconda并默认激活conda base环境(步骤详细/操作简单实用)
Ubuntu20.04安装anaconda并默认激活conda base环境方法
21920 0
|
网络安全 数据库
【保姆级教程】基于阿里云搭建网站,看这篇就够了!
本文演示了三种网站的搭建,分别是:博客、论坛、个人作品。从域名选择,到阿里云服务器的购买,到最后的网站搭建。
【保姆级教程】基于阿里云搭建网站,看这篇就够了!
|
存储 前端开发 对象存储
基于jsDelivr+Github给网站如何换个漂亮的字体。
本文介绍了如何为博客自定义字体。首先,从免费字体网站(如100字体下载站)下载字体,然后使用在线工具(如fontformat.com)转换字体格式为eot, woff, woff2, svg和ttf。接着,将字体文件上传至GitHub仓库,利用jsDelivr+GitHub的CDN服务获取文件链接。最后,通过编写@font-face的CSS样式代码,将自定义字体应用到博客中。注意文件名避免使用中文,并确保所有浏览器兼容。
494 2
|
消息中间件 大数据 Kafka
掌握大数据时代的心跳:实时数据处理的崛起
掌握大数据时代的心跳:实时数据处理的崛起
517 4
|
机器学习/深度学习 数据采集 传感器
智能交通信号:城市交通流的优化
【10月更文挑战第25天】智能交通信号系统通过集成现代信息技术、大数据分析和人工智能技术,实现交通信号动态优化,有效缓解城市交通拥堵,提升交通效率。系统涵盖数据采集、交通状态感知、流量预测、信号控制策略制定及实施优化等环节,已在多城市应用并取得显著效果。未来将向多模态数据融合、深度学习算法应用、区域协同控制和智能交通系统集成方向发展。
【多线程面试题二十五】、说说你对AQS的理解
这篇文章阐述了对Java中的AbstractQueuedSynchronizer(AQS)的理解,AQS是一个用于构建锁和其他同步组件的框架,它通过维护同步状态和FIFO等待队列,以及线程的阻塞与唤醒机制,来实现同步器的高效管理,并且可以通过实现特定的方法来自定义同步组件的行为。
【多线程面试题二十五】、说说你对AQS的理解
|
机器学习/深度学习 人工智能 自然语言处理
AIGC在创意产业的应用与影响
【7月更文第27天】近年来,人工智能生成内容(AI-Generated Content, AIGC)的发展为创意产业带来了前所未有的机遇。从艺术创作到音乐制作,再到游戏设计和广告营销,AIGC正在以惊人的速度改变着这些领域的面貌。本文将探讨AIGC在创意产业中的应用,并通过具体的代码示例来展示如何利用Python等工具创建一些基本的生成模型。
520 6
|
机器学习/深度学习 传感器 算法
【图像分割-阈值分割】基于灰狼算法指数熵多阈值图像分割附matlab代码
【图像分割-阈值分割】基于灰狼算法指数熵多阈值图像分割附matlab代码
【图像分割-阈值分割】基于灰狼算法指数熵多阈值图像分割附matlab代码