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

< cpp‎ | container‎ | set

定义于头文件 `<set>` |  |
template<class InputIt, class Comp = std::less<typename std::iterator_traits<InputIt>::value_type>, class Alloc = std::allocator<typename std::iterator_traits<InputIt>::value_type>> set(InputIt, InputIt, Comp = Comp(), Alloc = Alloc()) -> set<typename std::iterator_traits<InputIt>::value_type, Comp, Alloc>; | (1) | (C++17 起)
template<class Key, class Comp = std::less<Key>, class Alloc = std::allocator<Key>> set(std::initializer_list<Key>, Comp = Comp(), Alloc = Alloc()) -> set<Key, Comp, Alloc>; | (2) | (C++17 起)
template<class InputIt, class Alloc> set(InputIt, InputIt, Alloc) -> set<typename std::iterator_traits<InputIt>::value_type, std::less<typename std::iterator_traits<InputIt>::value_type>, Alloc>; | (3) | (C++17 起)
template<class Key, class Alloc> set(std::initializer_list<Key>, Alloc) -> set<Key, std::less<Key>, Alloc>; | (4) | (C++17 起)

为 set 提供这些推导指引以允许从范围（重载 (1,3) ）和 std::initializer_list （重载 (2,4) ）推导。此重载仅若 `InputIt` 满足老式输入迭代器 (LegacyInputIterator) 、 `Alloc` 满足分配器 (Allocator) 且 `Comp` 不满足分配器 (Allocator) 才参与重载决议。

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

### 示例

    #include <set>
    int main() {
       std::set s = {1,2,3,4}; // 指引 #2 推导 std::set<int>
       std::set s2(s.begin(), s.end()); // 指引 #1 推导 std::set<int>
    }