for user defined struct, as I understand, it\'s easy. Just overload the operator <. However, for int/float etc.., do I really need to overload operator < for int? Here is
The answers are good, so I just wanted to add a small example. Say you have the following array:
array<int, 10> A{5,2,8,3,4,1,9,12,0,7};
and you want to create a min heap
. The quickest way to do that is to use make_heap
algorithm. However, that creates a max heap
by default. In other words, if you call:
make_heap(A.begin(), A.end());
A
becomes a max heap
. To have a min heap
, on the other hand, you need to add a comparator but do not need to implement one. Instead call the method as follows:
make_heap(A.begin(), A.end(), greater<int>());
This call will make your array a min heap
.
PS: #include <algorithm>
is necessary to use std::make_heap
.
Same operations apply to the vector
as well.
HTH!
You shouldn't need to overload operator <
for int
(you can't, actually). If you use an external comparator, you should be passing the same Comparator comp
to pop_head
as well.
* Edit: *
As ildjarn pointed out, your comparison operator does not implement a strict-weak-ordering relation.
a < b ? false : true; --> a >= b
b < a ? true : false; --> a > b
Use std::greater<int>()
as the comparator(to all of make_heap
, push_heap
, pop_heap
). The ()
are important - std::greater<int>
is a functor class not a function, so you need an instance of it.