Is there an easy way to make a min heap in C++?

41,348

Solution 1

Use make_heap() and friends, defined in <algorithm>, or use priority_queue, defined in <queue>. The priority_queue uses make_heap and friends underneath.

#include <queue> // functional,iostream,ctime,cstdlib
using namespace std;

int main(int argc, char* argv[])
{
    srand(time(0));
    priority_queue<int,vector<int>,greater<int> > q;
    for( int i = 0; i != 10; ++i ) q.push(rand()%10);
    cout << "Min-heap, popped one by one: ";
    while( ! q.empty() ) {
        cout << q.top() << ' ';  // 0 3 3 3 4 5 5 6 8 9
        q.pop();
    }
    cout << endl;
    return 0;
}

Solution 2

You can use std::make_heap, std::push_heap, and others directly, or you can use a std::priority_queue built on a std::vector or similar.

The std::*_heap methods are in <algorithm>, and the std::priority_queue template is in <queue>.

Share:
41,348
Alex
Author by

Alex

Updated on November 09, 2020

Comments

  • Alex
    Alex over 3 years

    I'm very new to C++, and I was wondering if there was a way to make a min heap in C++ from the standard library.

  • Alex
    Alex about 14 years
    oh so if i popped from the priority_queue in c++ i'd get the min value?
  • jemfinch
    jemfinch about 14 years
    To clarify further, priority_queue's whole template accepts a container type, which defaults to vector<T>. Any container which supports random iteration and push_back will suffice, however.
  • Alex
    Alex about 14 years
    If say I have priority_queue<Node>, how do I set the sorting function of the queue?
  • jemfinch
    jemfinch about 14 years
    You would use the full template; in paraphrase, priority_queue<T, container, comp>. This question, and your original, honestly, is something you should be able to google yourself and find a satisfactory answer.
  • Potatoswatter
    Potatoswatter about 14 years
    @Alex: Or simply declare Node::operator<.
  • avakar
    avakar about 14 years
    To clarify more, priority_queue is a max-heap, if you want a min-heap, you have to use std::greater as a comparator. See Wilhelm's answer.
  • avakar
    avakar about 14 years
    +1 for (subtly) pointing out that priority_queue is a max-heap.