GeeksforGeeks App
Open App
Browser
Continue

# How to implement Min Heap using STL?

In C++ STL, there is priority_queue that can directly be used to implement Max Heap. In order to fully understand the code, make sure you are familiar with following concepts in C++

See below example:

## C++

 // C++ program to show that priority_queue is by// default a Max Heap#include using namespace std;  // Driver codeint main (){    // Creates a max heap    priority_queue 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;}

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;

`The third parameter, ‘Comparison Type’ can either be a function or functor (aka function object) that must have bool as return-type and must have 2 arguments.

Below is an example for integers.

## C++

 // C++ program to use priority_queue to implement min heap#include using namespace std;  // Driver codeint main (){    // Creates a min heap    priority_queue , greater > 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;}

Output:

1 5 10 20 30

Another method for making min-heap using default priority_queue:

This is frequently used in Competitive Programming. We first multiply all elements with (-1). Then we create a max heap (max heap is the default for priority queue). When we access the data and want to print it we simply multiply those elements with (-1) again.

Below is the implementation of the above idea:

## C++

 // C++ Program to implement min heap// using default priority_queue(max-heap)  #include #include using namespace std;  int main(){    // data    int arr[] = { 25, 7, 9, 15, 20, 36, 50 };          // default priority_queue using max-heap    priority_queue pq;          // size of the array    int n = sizeof(arr) / sizeof(arr[0]);      // multiply -1 with all elements while    // inserting    for (int i = 0; i < n; i++) {        pq.push((-1) * arr[i]);    }      // multiply all elements with -1 while    // retrieve the elements    while (!pq.empty()) {        cout << (pq.top()) * (-1) << " ";        pq.pop();    }      return 0;}

Output

7 9 15 20 25 36 50

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.

## C++

 // C++ program to use priority_queue to implement Min Heap// for user defined class#include using namespace std;  // User defined class, Pointclass Point{   int x;   int y;public:   Point(int x, int y)   {      this->x = x;      this->y = y;   }   int getX() const { return x; }   int getY() const { return y; }};  // To compare two pointsclass myComparator{public:    int operator() (const Point& p1, const Point& p2)    {        return p1.getX() > p2.getX();    }};  // Driver codeint main (){    // Creates a Min heap of points (order by x coordinate)    priority_queue , 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;}

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