Namespaces
Variants

deduction guides for std::map

From cppreference.net

(注:指定されたHTML要素には翻訳対象のテキストコンテンツが含まれていないため、構造は完全に保持されたままです)
定義済みヘッダー <map>
template < class InputIt,

class Comp = std:: less < /*iter-key-t*/ < InputIt >> ,
class Alloc = std:: allocator < /*iter-to-alloc-t*/ < InputIt >> >
map ( InputIt, InputIt, Comp = Comp ( ) , Alloc = Alloc ( ) )

- > map < /*iter-key-t*/ < InputIt > , /*iter-val-t*/ < InputIt > , Comp, Alloc > ;
(1) (C++17以降)
template < class Key,

class T,
class Comp = std:: less < Key > ,
class Alloc = std:: allocator < std:: pair < const Key, T >> >
map ( std:: initializer_list < std:: pair < Key, T >> , Comp = Comp ( ) , Alloc = Alloc ( ) )

- > map < Key, T, Comp, Alloc > ;
(2) (C++17以降)
template < class InputIt, class Alloc >

map ( InputIt, InputIt, Alloc )
- > map < /*iter-key-t*/ < InputIt > , /*iter-val-t*/ < InputIt > ,

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

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

- > map < Key, T, std:: less < Key > , Alloc > ;
(4) (C++17以降)
template < ranges:: input_range R, class Compare = std:: less < /*range-key-t*/ < R > ,

class Alloc = std:: allocator < /*range-to-alloc-t*/ < R >> >
map ( std:: from_range_t , R && , Compare = Compare ( ) , Alloc = Alloc ( ) )

- > map < /*range-key-t*/ < R > , range_mapped_t < R > , Compare, Alloc > ;
(5) (C++23以降)
template < ranges:: input_range R, class Alloc >

map ( std:: from_range_t , R && , Alloc )
- > map < /*range-key-t*/ < R > , range_mapped_t < R > ,

map std:: less < /*range-key-t*/ < R >> , Alloc > ;
(6) (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-4) これらの 推論ガイド は、 map に対してイテレータ範囲(オーバーロード (1,3) )および std::initializer_list (オーバーロード (2,4) )からの推論を可能にするために提供されています。
5,6) これらの導出ガイドは、 map に対して提供されており、 std::from_range_t タグと input_range からの導出を可能にします。

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

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

注記

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

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

不具合報告

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

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