How to implement Min Heap using STL?

06 Jul, 2022
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++ 
Container Adaptors in STL
Functors
See below example:
C++
// C++ program to show that priority_queue is by// default a Max Heap#include <bits/stdc++.h>using namespace std;  // Driver codeint 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;}
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 factor (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 <bits/stdc++.h>using namespace std;  // Driver codeint 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;}
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 <iostream>#include <queue>using namespace std;  int main(){    // data    int arr[] = { 25, 7, 9, 15, 20, 36, 50 };          // default priority_queue using max-heap    priority_queue<int> 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;}
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 <bits/stdc++.h>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 <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;}
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 
sachinkmr
estenger
Keshav Sharma 9
ratulmaity2504
gabaa406
as5853535
its0me0saurabh
cpp-priority-queue
STL
C++
STL
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Bitwise Operators in C/C++
Set in C++ Standard Template Library (STL)
vector erase() and clear() in C++
unordered_map in C++ STL
Substring in C++
Object Oriented Programming in C++
The C++ Standard Template Library (STL)
Inheritance in C++
C++ Classes and Objects
Sorting a vector in C++