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

时间:2015-09-07 13:59:26

标签: 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::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<int>在那个例子中做了什么?

另外,有人可以进一步解释这个声明吗?

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

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

答案 1 :(得分:2)

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

std :: priority_queue是一个包装另一个容器的容器,这意味着它只在另一个容器的顶部提供priorityqueue抽象,只要这个容器匹配SequenceContainer { {3}}

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

std::greater<T>T类型元素的比较器。它需要满足总排序。