# `std::priority_queue` 的推导指引

< cpp‎ | container‎ | priority queue

定义于头文件 `<queue>` |  |
template <class Comp, class Container> priority_queue(Comp, Container) -> priority_queue<typename Container::value_type, Container, Comp>; | (1) | (C++17 起)
template<class InputIt, class Comp = std::less</*iter-value-type*/<InputIt>>, class Container = std::vector</*iter-value-type*/<InputIt>> priority_queue(InputIt, InputIt, Comp = Comp(), Container = Container()) -> priority_queue</*iter-value-type*/<InputIt>, Container, Comp>; | (2) | (C++17 起)
template<class Comp, class Container, class Alloc> priority_queue(Comp, Container, Alloc) -> priority_queue<typename Container::value_type, Container, Comp>; | (3) | (C++17 起)
template<class InputIt, class Alloc> priority_queue(InputIt, InputIt, Alloc) -> priority_queue</*iter-value-type*/<InputIt>, std::vector</*iter-value-type*/<InputIt>, Alloc>, std::less</*iter-value-type*/<InputIt>>>; | (4) | (C++17 起)
template<class InputIt, class Comp, class Alloc> priority_queue(InputIt, InputIt, Comp, Alloc) -> priority_queue</*iter-value-type*/<InputIt>, std::vector</*iter-value-type*/<InputIt>, Alloc>, Comp>; | (5) | (C++17 起)
template<class InputIt, class Comp, class Container, class Alloc> priority_queue(InputIt, InputIt, Comp, Container, Alloc) -> priority_queue<typename Container::value_type, Container, Comp>; | (6) | (C++17 起)

为 std::priority_queue 提供这些推导指引以允许从底层容器类型以及从迭代器范围推导。对任何类型 `It` ， /*iter-value-type*/<It> 指代 typename std::iterator_traits<It>::value_type 。

这些重载仅若

- `InputIt` 满足老式输入迭代器 (LegacyInputIterator) 、
- `Comp` 不满足分配器 (Allocator) 、
- `Container` 不满足分配器 (Allocator) ，
- 对于重载 (4) 与 (5) ， (C++23 起) `Alloc` 满足分配器 (Allocator) ，并且
- 对于重载 (3) 与 (6) ， std::uses_allocator_v<Container, Alloc> 为 true 才参与重载决议。

注意：库确定类型是否满足老式输入迭代器 (LegacyInputIterator) 的程度是未指定的，除了最低要求是整数类型不具备输入迭代器的条件。类似地，确定类型是否满足分配器 (Allocator) 是未指定的，除了最低要求是成员类型 `Alloc::value_type` 必须存在，且表达式 std::declval<Alloc&>().allocate(std::size_t{}) 在作为不求值操作数时必须为良构。

### 示例

    #include <vector>
    #include <queue>
    int main() {
       std::vector<int> v = {1,2,3,4};
       std::priority_queue pq1{std::greater<int>{}, v}; // 推导 std::priority_queue<
                                                        //   int, std::vector<int>,
                                                        //   std::greater<int>>
       std::priority_queue pq2{v.begin(), v.end()}; // 推导 std::priority_queue<int>
    }

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3506 | C++17 | 缺少源自迭代器和分配器的推导指引 | 已添加