# 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.

 `// C++ program to show that priority_queue is by ` `// default a Max Heap ` `#include ` `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; ` `} `

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.

 `// C++ program to use priority_queue to implement min heap ` `#include ` `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; ` `} `

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.

 `// C++ program to use priority_queue to implement Min Heap ` `// for user defined class ` `#include ` `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 , 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)```

My Personal Notes arrow_drop_up

Improved By : sachinkmr, estenger

Article Tags :
Practice Tags :

24

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