sar*_*ftw 2 c++ stl vector priority-queue c++11
我正在查看一些STL文档.我看到以降序存储的优先级队列的语法是:
std::priority_queue<int> q ;
//gives 9 8 7 6 5 4 3 2 1 when pushed and obtained
Run Code Online (Sandbox Code Playgroud)
但是,为了以升序方式存储,它是:
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
Run Code Online (Sandbox Code Playgroud)
我想知道第二个例子中额外模板参数的具体用途是什么.就像在std::vector<int>那个例子中做什么的那样?
此外,有人可以进一步解释这个声明吗?
priority_queue< pair<int ,int > , vector< pair<int ,int > > , greater< pair<int ,int > > > q ;
Run Code Online (Sandbox Code Playgroud)
std::priority_queue它本身不是一个容器,它是一个容器适配器,这意味着它在内部使用另一个容器来将实际数据存储在队列中.
默认情况下,它使用std::vector存储在队列中的类型.
这里的问题是,就像将参数传递给具有默认参数的函数一样,即使它们具有默认类型,也不能跳过模板列表中的参数,必须始终提供先前的模板参数.
如果您看到链接引用,您将看到第二个和第三个模板参数std::priority_queue具有默认类型.如果要更改第三个模板参数,还必须提供第二个模板参数,即实际的基础容器.所以对于一个std::priority_queue的int,你需要提供std::vector<int>.
但是有一种方法可以不将比较器的类型作为模板参数传递,std::priority_queue构造函数还为比较器函数采用(可选)参数.在这里,您可以提供任何函数,函数对象,lambda或其他可调用对象.
在你的情况下你可以做例如
std::priority_queue<int> q{std::greater<int>()};
Run Code Online (Sandbox Code Playgroud)
上面的声明创建了一个std::greater<int>对象,并将其作为比较器传递给std::priority_queue构造函数.
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |