How to implement Min Heap using STL?

In C++ STL, there is priority_queue that can directly be used to implement Max Heap. See below example.

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to show that priority_queue is by
// default a Max Heap
#include <bits/stdc++.h>
using namespace std;
  
// Driver code
int main ()
{
    // Creates a max heap
    priority_queue <int> pq;
    pq.push(5);
    pq.push(1);
    pq.push(10);
    pq.push(30);
    pq.push(20);
  
    // One by one extract items from max heap
    while (pq.empty() == false)
    {
        cout << pq.top() << " ";
        pq.pop();
    }
  
    return 0;
}

chevron_right


Output :

30 20 10 5 1

Since elements are printed in descending order, we have a max heap by default.



 

How to implement Min Heap?
priority_queue supports a constructor that requires two extra arguments to make it min heap.

    priority_queue <Type, vector<Type>, ComparisonType > min_heap;

`

Below is an example for integers.

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to use priority_queue to implement min heap
#include <bits/stdc++.h>
using namespace std;
  
// Driver code
int main ()
{
    // Creates a min heap
    priority_queue <int, vector<int>, greater<int> > pq;
    pq.push(5);
    pq.push(1);
    pq.push(10);
    pq.push(30);
    pq.push(20);
  
    // One by one extract items from min heap
    while (pq.empty() == false)
    {
        cout << pq.top() << " ";
        pq.pop();
    }
  
    return 0;
}

chevron_right


Output :

1 5 10 20 30 

 

How to make a min heap of user defined class?
Let us consider below example where we build a min heap of 2 D points ordered by X axis.

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to use priority_queue to implement Min Heap
// for user defined class
#include <bits/stdc++.h>
using namespace std;
  
// User defined class, Point
class Point
{
   int x;
   int y;
public:
   Point(int _x, int _y)
   {
      x = _x;
      y = _y;
   }
   int getX() const { return x; }
   int getY() const { return y; }
};
  
// To compare two points
class myComparator
{
public:
    int operator() (const Point& p1, const Point& p2)
    {
        return p1.getX() > p2.getX();
    }
};
  
// Driver code
int main ()
{
    // Creates a Min heap of points (order by x coordinate)
    priority_queue <Point, vector<Point>, myComparator > pq;
  
    // Insert points into the min heap
    pq.push(Point(10, 2));
    pq.push(Point(2, 1));
    pq.push(Point(1, 5));
  
    // One by one extract items from min heap
    while (pq.empty() == false)
    {
        Point p = pq.top();
        cout << "(" << p.getX() << ", " << p.getY() << ")";
        cout << endl;
        pq.pop();
    }
  
    return 0;
}

chevron_right


Output :

(1, 5)
(2, 1)
(10, 2)

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above



My Personal Notes arrow_drop_up

Improved By : sachinkmr, estenger



Article Tags :
Practice Tags :


2


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.