Search code examples
c++vectorpriority-queuedeque

Instantiating priority_queue with deque does not compile - with vector it does. Why is that?


In the below program why does the construction with deque fail but the construction with vector is ok?

Both provide the functions and the RandomAccess iterator expected by priority_queue. I do not see the reason.

I tested it for C++98, C++11 and C++14: see test program

#include <vector>
#include <deque>
#include <queue>

using namespace std;

int main()
{
    deque<int> d; 
    priority_queue<int> q(d.begin(), d.end());

    vector<int> v; 
    priority_queue<int> q1(less<int>(), v); //compiles

    deque<int> d1; 
    priority_queue<int> q2(less<int>(), d1); //does not compile

    return 0;
}

Solution

  • You missed to specify deque<int> as template parameter for priority_queue:

    deque<int> d1; 
    priority_queue<int,deque<int>> q2(less<int>(), d1); 
                    // ^^^^^^^^^^
    

    See the working example here.

    See the reference documentation of std::priority_queue. std::vector is taken as default type parameter for the template:

    template<
        class T,
        class Container = std::vector<T>, // <<<<<<<<<<<<<<<<
        class Compare = std::less<typename Container::value_type>
    > class priority_queue;
    

    That's why the other version compiles.