提问者:小点点

std::priority_queue的模板参数是什么?


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

std::priority_queue<int> q ;
//gives 9 8 7 6 5 4 3 2 1  when pushed and obtained

但是,对于以升序方式存储,它是:

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::vector在该示例中是做什么的?

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

priority_queue< pair<int ,int > , vector< pair<int ,int > > , greater< pair<int ,int > > > q ;

共2个答案

匿名用户

std::priority_queue本身不是一个容器,它是一个容器适配器,这意味着它在内部使用另一个容器来存储队列中的实际数据。

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

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

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

<罢工> 但是,有一种方法可以不将比较器的类型作为模板参数传递,即 std::priority_queue构造函数还为比较器函数接受一个(可选)参数。 在这里您可以提供任何函数,函数对象,lambda或其他可调用对象。

在你的情况下,你可以做。

std::priority_queue<int> q{std::greater<int>()};

<罢工> 上面的声明创建了一个 std::greater对象,并将其作为比较器传递给 std::priority_queue构造函数。

匿名用户

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

std::priority_queue是一个包装另一个容器的容器,这意味着它只在另一个容器之上提供priorityqueue抽象,只要这个容器与sequenceContainer概念匹配。

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

std::greaterTT类型元素的比较器。 必须满足总订货要求。