Namespaces
Variants

deduction guides for std::unordered_multimap

From cppreference.net

定義済みヘッダー <unordered_map>
template < class InputIt,

class Hash = std:: hash < /*iter-key-t*/ < InputIt >> ,
class Pred = std:: equal_to < /*iter-key-t*/ < InputIt >> ,
class Alloc = std:: allocator < /*iter-to-alloc-t*/ < InputIt >> >
unordered_multimap ( InputIt, InputIt,
typename /* 下記参照 */ :: size_type = /* 下記参照 */ ,
Hash = Hash ( ) , Pred = Pred ( ) , Alloc = Alloc ( ) )
- > unordered_multimap < /*iter-key-t*/ < InputIt > , /*iter-val-t*/ < InputIt > ,

Hash, Pred, Alloc > ;
(1) (C++17以降)
template < class Key, class T, class Hash = std:: hash < Key > ,

class Pred = std:: equal_to < Key > ,
class Alloc = std:: allocator < std:: pair < const Key, T >> >
unordered_multimap ( std:: initializer_list < std:: pair < Key, T >> ,
typename /* 詳細は下記参照 */ :: size_type = /* 詳細は下記参照 */ ,
Hash = Hash ( ) , Pred = Pred ( ) , Alloc = Alloc ( ) )

- > unordered_multimap < Key, T, Hash, Pred, Alloc > ;
(2) (C++17以降)
template < class InputIt, class Alloc >

unordered_multimap ( InputIt, InputIt, typename /* 詳細は下記参照 */ :: size_type , Alloc )
- > unordered_multimap < /*iter-key-t*/ < InputIt > , /*iter-val-t*/ < InputIt > ,
std:: hash < /*iter-key-t*/ < InputIt >> ,

std:: equal_to < /*iter-key-t*/ < InputIt >> , Alloc > ;
(3) (C++17以降)
template < class InputIt, class Alloc >

unordered_multimap ( InputIt, InputIt, Alloc )
- > unordered_multimap < /*iter-key-t*/ < InputIt > , /*iter-val-t*/ < InputIt > ,
std:: hash < /*iter-key-t*/ < InputIt >> ,

std:: equal_to < /*iter-key-t*/ < InputIt >> , Alloc > ;
(4) (C++17以降)
template < class InputIt, class Hash, class Alloc >

unordered_multimap ( InputIt, InputIt, typename /* 下記参照 */ :: size_type , Hash,
Alloc )
- > unordered_multimap < /*iter-key-t*/ < InputIt > , /*iter-val-t*/ < InputIt > , Hash,

std:: equal_to < /*iter-key-t*/ < InputIt >> , Alloc > ;
(5) (C++17以降)
template < class Key, class T, typename Alloc >

unordered_multimap ( std:: initializer_list < std:: pair < Key, T >> ,
typename /* see below */ :: size_type , Alloc )

- > unordered_multimap < Key, T, std:: hash < Key > , std:: equal_to < Key > , Alloc > ;
(6) (C++17以降)
template < class Key, class T, typename Alloc >

unordered_multimap ( std:: initializer_list < std:: pair < Key, T >> , Alloc )

- > unordered_multimap < Key, T, std:: hash < Key > , std:: equal_to < Key > , Alloc > ;
(7) (C++17以降)
template < class Key, class T, class Hash, class Alloc >

unordered_multimap ( std:: initializer_list < std:: pair < Key, T >> ,
typename /* 詳細は下記参照 */ :: size_type , Hash, Alloc )

- > unordered_multimap < Key, T, Hash, std:: equal_to < Key > , Alloc > ;
(8) (C++17以降)
template < ranges:: input_range R,

class Hash = std:: hash < /*range-key-t*/ < R >> ,
class Pred = std:: equal_to < /*range-key-t*/ < R >> ,
class Alloc = std:: allocator < /*range-to-alloc-t*/ < R >> >
unordered_multimap ( std:: from_range_t , R && ,
typename /* 詳細は後述 */ :: size_type = /* 詳細は後述 */ ,
Hash = Hash ( ) , Pred = Pred ( ) , Alloc = Alloc ( ) )
- > unordered_multimap < /*range-key-t*/ < R > , /*range-mapped-t*/ < R > ,

Hash, Pred, Alloc > ;
(9) (C++23以降)
template < ranges:: input_range R, class Alloc >

unordered_multimap ( std:: from_range_t , R && ,
typename /* 詳細は下記参照 */ :: size_type , Alloc )
- > unordered_multimap < /*range-key-t*/ < R > , /*range-mapped-t*/ < R > ,
std:: hash < /*range-key-t*/ < R >> ,

std:: equal_to < /*range-key-t*/ < R >> , Alloc > ;
(10) (C++23以降)
template < ranges:: input_range R, class Alloc >

unordered_multimap ( std:: from_range_t , R && , Alloc )
- > unordered_multimap < /*range-key-t*/ < R > , /*range-mapped-t*/ < R > ,
std:: hash < /*range-key-t*/ < R >> ,

std:: equal_to < /*range-key-t*/ < R >> , Alloc > ;
(11) (C++23以降)
template < ranges:: input_range R, class Hash, class Alloc >

unordered_multimap ( std:: from_range_t , R && , typename /* 詳細は下記参照 */ :: size_type ,
Hash, Alloc )
- > unordered_multimap < /*range-key-t*/ < R > , /*range-mapped-t*/ < R > , Hash,

std:: equal_to < /*range-key-t*/ < R >> , Alloc > ;
(12) (C++23以降)
説明専用ヘルパー型エイリアス
template < class InputIt >

using /*iter-val-t*/ =

typename std:: iterator_traits < InputIt > :: value_type ;
( 説明専用* )
template < class InputIt >

using /*iter-key-t*/ =

std:: remove_const_t < std:: tuple_element_t < 0 , /*iter-val-t*/ < InputIt >>> ;
( 説明専用* )
template < class InputIt >

using /*iter-mapped-t*/ =

std:: tuple_element_t < 1 , /*iter-val-t*/ < InputIt >> ;
( 説明専用* )
template < class InputIt >

using /*iter-to-alloc-t*/ =
std:: pair < std:: add_const_t < tuple_element_t < 0 , /*iter-val-t*/ < InputIt >>> ,

std:: tuple_element_t < 1 , /*iter-val-t*/ < InputIt >>> ;
( 説明専用* )
template < ranges:: input_range Range >

using /*range-key-t*/ =

std:: remove_const_t < typename ranges:: range_value_t < Range > :: first_type > ;
(C++23以降)
( 説明専用* )
template < ranges:: input_range Range >

using /*range-mapped-t*/ =

typename ranges:: range_value_t < Range > :: second_type ;
(C++23以降)
( 説明専用* )
template < ranges:: input_range Range >

using /*range-to-alloc-t*/ =
std:: pair < std:: add_const_t < typename ranges:: range_value_t < Range > :: first_type > ,

typename ranges:: range_value_t < Range > :: second_type > ;
(C++23以降)
( 説明専用* )
1-8) これらの deduction guide は、 unordered_multimap に対して提供され、イテレータ範囲からの推定(オーバーロード (1,3-5) )および std::initializer_list からの推定(オーバーロード (2,6-8) )を可能にします。
9-12) これらの推論ガイドは unordered_multimap に対して提供され、 std::from_range_t タグと input_range からの推論を可能にします。

これらのオーバーロードは、以下の条件がすべて満たされる場合にのみオーバーロード解決に参加します: InputIt LegacyInputIterator を満たし、 Alloc Allocator を満たし、 Hash Pred のいずれも Allocator を満たさず、かつ Hash が整数型ではない場合です。

注意: ライブラリが型が LegacyInputIterator を満たさないと判断する程度は未規定であるが、少なくとも整数型は入力イテレータとして適格ではない。同様に、型が Allocator を満たさないと判断する程度は未規定であるが、少なくともメンバ型 Alloc::value_type が存在しなければならず、式 std:: declval < Alloc & > ( ) . allocate ( std:: size_t { } ) が未評価オペランドとして扱われた場合に well-formed でなければならない。

これらのガイドにおける size_type パラメータ型は、推論ガイドによって推定される型の size_type メンバ型を参照します。

注記

機能テスト マクロ 標準 機能
__cpp_lib_containers_ranges 202202L (C++23) レンジ対応 構築と挿入; オーバーロード ( 9-12 )

#include <unordered_map>
int main()
{
    // std::unordered_multimap m1 = {{"foo", 1}, {"bar", 2}};
        // エラー: 波括弧初期化リストには型がありません:
        // {"foo", 1} または {"bar", 2} から pair<Key, T> を推論できません
    std::unordered_multimap m1 = {std::pair{"foo", 2}, {"bar", 3}}; // ガイド #2
    std::unordered_multimap m2(m1.begin(), m1.end()); // ガイド #1
}

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3025 C++17 初期化子リストガイド ( 2 ) および ( 6-8 ) std:: pair < const Key, T > を取る std:: pair < Key, T > を使用する