C++ std::priority_队列的模板参数是什么?

C++ std::priority_队列的模板参数是什么?,c++,c++11,vector,stl,priority-queue,C++,C++11,Vector,Stl,Priority Queue,我在看一些STL文档。我看到按降序存储的优先级队列的语法是: std::priority_queue<int> q ; //gives 9 8 7 6 5 4 3 2 1 when pushed and obtained std::优先级队列q; //按下并获取时给出9 8 7 6 5 4 3 2 1 但是,对于以升序方式存储,它是: std::priority_queue< int, std::vector<int>, std::greater<int

我在看一些STL文档。我看到按降序存储的优先级队列的语法是:

std::priority_queue<int> q ;
//gives 9 8 7 6 5 4 3 2 1  when pushed and obtained
std::优先级队列q;
//按下并获取时给出9 8 7 6 5 4 3 2 1
但是,对于以升序方式存储,它是:

std::priority_queue< int, std::vector<int>, std::greater<int> > q ;
//gives 1 2 3 4 5 6 7 8 9 when pushed and obtained
std::priority\u队列q;
//推取时给出123456789
我想知道第二个示例中额外模板参数的具体用途是什么。在这个例子中,
std::vector
做了什么

还有,有人能进一步解释一下这个声明吗

priority_queue< pair<int ,int > , vector< pair<int ,int > > , greater< pair<int ,int > > > q ;
优先级\u队列,大于>q;
本身不是一个容器,而是一个容器适配器,这意味着它在内部使用另一个容器来存储队列中的实际数据

默认情况下,它使用队列中存储的类型的
std::vector

这里的问题是,就像将参数传递给具有默认参数的函数一样,您不能跳过模板列表中的参数,即使它们具有默认类型,您必须始终提供以前的模板参数

如果您看到链接引用,您将看到
std::priority_queue
的第二个和第三个模板参数具有默认类型。如果要更改第三个模板参数,还必须提供第二个模板参数,即实际的底层容器。因此,对于
int
std::priority\u队列
,您需要提供
std::vector


但是,有一种方法可以不将比较器的类型作为模板参数传递,也可以为比较器函数获取一个(可选)参数。在这里,您可以提供任何函数、函数对象、lambda或其他可调用对象

在你的情况下,你可以这样做

std::priority_queue<int> q{std::greater<int>()};
std::priority_队列q{std::greater()};
上面的声明创建了一个
std::greater
对象,并将其作为比较器传递给
std::priority\u队列
构造函数。

模板<
T类,
类容器=std::vector,
类比较=std::less
>类优先级队列;
std::priority_queue是一个包装另一个容器的容器,这意味着它只在另一个容器上提供
priority
queue
抽象,只要这个容器与
SequenceContainer
匹配

如果用户需要不同的时间和内存复杂性约束,则可以更改容器。或者提供自己的容器


std::greater
是类型为
T
的元素上的比较器。在C++中,你不能设置第三个参数而不设置以前的参数。为什么在第一个例子中不需要指定向量???@saru95因为它有一个默认类型,请查看链接引用。那么,你是说在第一种情况下默认使用向量,但在第二种情况下由于
更大
我们必须明确指定它?@saru95这是正确的。不过,还有另一种传递比较器的方法可供使用,请参阅我的更新答案。向下投票,因为:1)
std::priority_queue q(std::greater())将被解析为函数指针声明,而不是对象构造函数2)std::priority_队列没有您正在使用的构造函数;它只接受类型为
Compare
的比较器,默认为
std::less
。您必须指定一个不同的比较器类型作为模板参数,才能实现这一点。
template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;