最終更新日時(UTC):
が更新

履歴 編集

<unordered_map>

std::unordered_map::推論補助(C++17)

namespace std {
  // 説明用の型
  template <class InputIterator>
  using iter_key_t = remove_const_t<typename iterator_traits<InputIterator>::value_type::first_type>;
  template <class InputIterator>
  using iter_val_t = typename iterator_traits<InputIterator>::value_type::second_type;
  template <class InputIterator>
  using iter_to_alloc_t = pair<add_const_t<typename iterator_traits<InputIterator>::value_type::first_type>,
                               typename iterator_traits<InputIterator>::value_type::second_type>;

  template <class InputIterator,
            class Hash = hash<iter_key_t<InputIterator>>,
            class Pred = equal_to<iter_key_t<InputIterator>>,
            class Allocator = allocator<iter_to_alloc_t<InputIterator>>>
  unordered_map(InputIterator, InputIterator, typename see below::size_type = see below,
                Hash = Hash(), Pred = Pred(), Allocator = Allocator())
    -> unordered_map<iter_key_t<InputIterator>,
                     iter_value_t<InputIterator>,
                     Hash, Pred, Allocator>;         // (1)

  template <class Key, class T,
            class Hash = hash<Key>,
            class Pred = equal_to<Key>,
            class Allocator = allocator<pair<const Key, T>>>
  unordered_map(initializer_list<pair<Key, T>>,
                typename see below::size_type = see below,
                Hash = Hash(), Pred = Pred(), Allocator = Allocator())
    -> unordered_map<Key, T, Hash, Pred, Allocator>; // (2)

  template <class InputIterator, class Allocator>
  unordered_map(InputIterator, InputIterator, typename see below::size_type, Allocator)
    -> unordered_map<
           iter_key_t<InputIterator>,
           iter_val_t<InputIterator>,
           hash<iter_key_t<InputIterator>>,
           equal_to<iter_key_t<InputIterator>>,
           Allocator>;                               // (3)

  template <class InputIterator, class Allocator>
  unordered_map(InputIterator, InputIterator, Allocator)
    -> unordered_map<
           iter_key_t<InputIterator>,
           iter_val_t<InputIterator>,
           hash<iter_key_t<InputIterator>>,
           equal_to<iter_key_t<InputIterator>>,
           Allocator>;                               // (4)

  template <class InputIterator, class Hash, class Allocator>
  unordered_map(InputIterator, InputIterator, typename see below::size_type, Hash, Allocator)
    -> unordered_map<
           iter_key_t<InputIterator>,
           iter_val_t<InputIterator>,
           Hash,
           equal_to<iter_key_t<InputIterator>>,
           Allocator>;                               // (5)

  template <class Key, class T, typename Allocator>
  unordered_map(initializer_list<pair<Key, T>>, typename see below::size_type, Allocator)
    -> unordered_map<Key, T, hash<Key>,
                     equal_to<Key>, Allocator>;      // (6)

  template <class Key, class T, typename Allocator>
  unordered_map(initializer_list<pair<Key, T>>, Allocator)
    -> unordered_map<Key, T, hash<Key>,
                     equal_to<Key>, Allocator>;      // (7)

  template <class Key, class T, class Hash, class Allocator>
  unordered_map(initializer_list<pair<Key, T>>, typename see below::size_type, Hash, Allocator)
    -> unordered_map<Key, T, Hash,
                     equal_to<Key>, Allocator>;      // (8)
}

概要

std::unordered_mapクラステンプレートの型推論補助。

  • (1) : イテレータ範囲からの推論
  • (2) : 初期化子リストからの推論
  • (3) : イテレータ範囲とバケット数、アロケータからの推論
  • (4) : イテレータ範囲とアロケータからの推論
  • (5) : イテレータ範囲とバケット数、ハッシュ関数、アロケータからの推論
  • (6) : 初期化子リストとバケット数、アロケータからの推論
  • (7) : 初期化子リストとアロケータからの推論
  • (8) : 初期化子リストとバケット数、ハッシュ関数、アロケータからの推論

備考

  • メンバ型size_typeは自動的に推論される
  • C++17時点において、unordered_mapの推論補助は使いにくい。これはイテレータ範囲や組でのキーの型がconst Keyとなっているためだ。この使いにくさは、将来の言語拡張で改良される可能性がある。
    // コンパイルエラー! 初期化子リストからconst Keyを導出できない
    unordered_map m = {{"foo", 2}, {"bar", 3}, {"baz", 4}};
    
    // OK
    unordered_map m2 = initializer_list<pair<char const *, int>>({{"foo", 2}, {"bar", 3}, {"baz", 4}});
    

バージョン

言語

  • C++17

処理系

関連項目

参照