C++ --priority_queue实现

简介: 1. 普通版本实现优先级队列1.1 push()

1. 普通版本实现优先级队列

1.1 push()

void adjust_up(int child)
{
  int parent = (child - 1) / 2;
  while (child > 0)
  {
    if (_container[parent] < _container[child])
    {
      swap(_container[parent], _container[child]);
      child = parent;
      parent = (child - 1) / 2;
    }
    else
    {
      break;
    }
  }
}
void push(const T& val)
{
  _container.push_back(val);
  adjust_up(_container.size() - 1);
}

1.2 pop()

void adjust_down(int parent)
{
  int child = parent * 2 + 1;
  while (child < _container.size())
  {
    if (child + 1 < _container.size() && _container[child] < _container[child + 1])
    {
      child = child + 1;
    }
    if (_container[parent] < _container[child])
    {
      swap(_container[parent], _container[child]);
      parent = child;
      child = parent * 2 + 1;
    }
    else
    {
      break;
    }
  }
}
void pop()
{
  swap(_container[0], _container[_container.size() - 1]);
  _container.pop_back();
  adjust_down(0);
}

1.3 top()

const T& top()
{
  return _container[0];
}

1.4 size()

size_t size()
{
  return _container.size();
}

1.5 empty()

bool empty()
{
  return _container.empty();
}

1.6 完整代码

namespace my_priority_queue
{
  template <class T, class Container = vector<int>>
  class priority_queue
  {
  public:
    void adjust_up(int child)
    {
      int parent = (child - 1) / 2;
      while (child > 0)
      {
        if (_container[parent] < _container[child])
        {
          swap(_container[parent], _container[child]);
          child = parent;
          parent = (child - 1) / 2;
        }
        else
        {
          break;
        }
      }
    }
    void adjust_down(int parent)
    {
      int child = parent * 2 + 1;
      while (child < _container.size())
      {
        if (child + 1 < _container.size() && _container[child] < _container[child + 1])
        {
          child = child + 1;
        }
        if (_container[parent] < _container[child])
        {
          swap(_container[parent], _container[child]);
          parent = child;
          child = parent * 2 + 1;
        }
        else
        {
          break;
        }
      }
    }
    void push(const T& val) 
    {
      _container.push_back(val);
      adjust_up(_container.size() - 1);
    }
    void pop()
    {
      swap(_container[0], _container[_container.size() - 1]);
      _container.pop_back();
      adjust_down(0);
    }
    const T& top()
    {
      return _container[0];
    }
    size_t size()
    {
      return _container.size();
    }
    bool empty()
    {
      return _container.empty();
    }
  private:
    Container _container;
  };
}

2. 仿函数实现优先级队列

namespace my_priority_queue
{
  template <class T>
  struct less
  {
    bool operator()(const T& x, const T& y)
    {
      return x < y;
    }
  };
  template <class T>
  struct greator
  {
    bool operator()(const T& x, const T& y)
    {
      return x > y;
    }
  };
  template <class T, class Container = vector<int>, class Compare = less<int>>
  class priority_queue
  {
  public:
    void adjust_up(int child)
    {
      Compare compare;
      int parent = (child - 1) / 2;
      while (child > 0)
      {
        //if (_container[parent] < _container[child])
        if (compare(_container[parent],_container[child]))
        {
          swap(_container[parent], _container[child]);
          child = parent;
          parent = (child - 1) / 2;
        }
        else
        {
          break;
        }
      }
    }
    void adjust_down(int parent)
    {
      Compare compare;
      int child = parent * 2 + 1;
      while (child < _container.size())
      {
        if (child + 1 < _container.size() &&    compare(_container[child],_container[child + 1]))
        {
          child = child + 1;
        }
        if (compare(_container[parent], _container[child]))
        {
          swap(_container[parent], _container[child]);
          parent = child;
          child = parent * 2 + 1;
        }
        else
        {
          break;
        }
      }
    }
    void push(const T& val) 
    {
      _container.push_back(val);
      adjust_up(_container.size() - 1);
    }
    void pop()
    {
      swap(_container[0], _container[_container.size() - 1]);
      _container.pop_back();
      adjust_down(0);
    }
    const T& top()
    {
      return _container[0];
    }
    size_t size()
    {
      return _container.size();
    }
    bool empty()
    {
      return _container.empty();
    }
  private:
    Container _container;
  };
}

仿函数在这里就是类中实现一个()运算符重载,通过对象直接调用,比较大小返回一个真假值。















相关文章
|
7月前
|
存储 算法 C++
c++的学习之路:17、stack、queue与priority_queue
c++的学习之路:17、stack、queue与priority_queue
57 0
|
7月前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— priority_queue(STL)优先队列
本文介绍了C++的STL组件`std::priority_queue`,它是一个容器适配器,实现优先队列数据结构,通常基于堆实现。文章讨论了优先队列的基本概念、特点和底层堆结构,强调了其自动排序和优先级最高元素的访问。还展示了如何定义、插入、访问和移除元素,以及自定义比较函数。此外,提供了模拟实现`priority_queue`的代码示例,探讨了仿函数的作用,包括默认的`std::less`和自定义比较函数。文章鼓励读者进一步探索C++的优先队列及其应用。
89 3
|
5月前
|
存储 算法 Java
【C++】优先级队列priority_queue模拟实现&&仿函数
【C++】优先级队列priority_queue模拟实现&&仿函数
42 1
|
5月前
|
存储 算法 C语言
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
|
7月前
|
存储 算法 C语言
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)(下)
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)
56 2
|
7月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(上)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
54 1
|
7月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
30 0
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
|
6月前
|
存储 设计模式 算法
【C++航海王:追寻罗杰的编程之路】priority_queue(优先队列) | 容器适配器你知道哪些?
【C++航海王:追寻罗杰的编程之路】priority_queue(优先队列) | 容器适配器你知道哪些?
56 0
|
7月前
|
算法 C语言 C++
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)(中)
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)
49 0
|
7月前
|
缓存 算法 C语言
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)(上)
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)
43 0