Home > front end >  Why does not std::priority_queue constructor work?
Why does not std::priority_queue constructor work?

Time:05-09

Why is it that when I call the same constructor, it works in one case, but not in the other?

std::vector<ulli> v(n);
for(int i = 0; i < n; i  ){
    inf >> v[i];
}
std::priority_queue<ulli> q1(std::greater<ulli>(), v);  //  fails
std::priority_queue<ulli> q2(std::less<ulli>(), v);  //  works

CodePudding user response:

Because of the default template parameter, the Compare of std::priority_queue<ulli> is of type std::less, and in your first example, you use std::greater to initialize std::less, which is not correct.

With help of CTAD, just

std::priority_queue q1(std::greater<ulli>(), v);

CodePudding user response:

As you can see from this page on cppreference, std::priority_queue<T> has two defaulted template parameters:

  • one being its container type (Container = std::vector<T>);
  • and the other being its comparator type (Compare = std::less<T>).

So,

std::priority_queue<ulli>

indeed means

std::priority_queue<ulli, std::vector<ulli>, std::less<ulli>>

and provides no constructor that takes a std::greater<ulli> as comparator.

You should declare q1 as

std::priority_queue<ulli, std::vector<ulli>, std::greater<ulli>> q1(std::greater<ulli>(), v);

Or, if you're in C 17 (or newer), just:

std::priority_queue q1(std::greater<ulli>(), v);
  • Related