名前空間
変種
操作

std::map

From cppreference.com
< cpp‎ | container
 
 
 
 
ヘッダ <map> で定義
template<

    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T>>

> class map;
(1)
namespace pmr {

    template<
        class Key,
        class T,
        class Compare = std::less<Key>
    > using map = std::map<Key, T, Compare,
                           std::pmr::polymorphic_allocator<std::pair<const Key, T>>>;

}
(2) (C++17以降)

std::mapは、ユニークなキーを持つキーと値のペアを格納する、ソート済み連想コンテナである。キーは比較関数Compareを用いてソートされる。検索、削除、挿入操作は対数時間計算量を持つ。mapは通常、赤黒木として実装される。

std::mapのイテレータは、キーの昇順で走査する。ここでの昇順は、構築時に使用された比較によって定義される。すなわち、

  • std::mapであるm
  • mへの間接参照可能なイテレータit_lit_rがあり、it_l < it_rであるとき、

m.value_comp()(*it_l, *it_r) == trueが成り立つ(デフォルトの比較を使用する場合、最小から最大へ)。

標準ライブラリがCompare要件を使用する箇所ではどこでも、一意性(uniqueness)は同値関係(equivalence relation)を用いて決定される。平易に言えば、2つのオブジェクトabは、どちらも他方より小さいと見なされない場合、つまり!comp(a, b) && !comp(b, a)の場合に、同値(一意ではない)と見なされる。

std::mapは、コンテナ(Container)アロケータ認識コンテナ(AllocatorAwareContainer)連想コンテナ(AssociativeContainer)、およびリバーシブルコンテナ(ReversibleContainer)の要件を満たす。

std::mapの全てのメンバ関数はconstexprである:定数式の評価においてstd::mapオブジェクトを作成し使用することが可能である。

しかし、動的に確保されたストレージは同じ定数式の評価内で解放されなければならないため、std::mapオブジェクトは一般的にconstexprにはなれない。

(C++26以降)

目次

[編集] テンプレートパラメータ

[編集] メンバ型

定義
key_type Key[編集]
mapped_type T[編集]
value_type std::pair<const Key, T>[編集]
size_type 符号なし整数型 (通常は std::size_t)[編集]
difference_type 符号付き整数型 (通常は std::ptrdiff_t)[編集]
key_compare Compare[編集]
allocator_type Allocator[編集]
reference value_type&[編集]
const_reference const value_type&[編集]
pointer

Allocator::pointer

(C++11まで)

std::allocator_traits<Allocator>::pointer

(C++11以降)
[編集]
const_pointer

Allocator::const_pointer

(C++11まで)

std::allocator_traits<Allocator>::const_pointer

(C++11以降)
[編集]
iterator value_type への LegacyBidirectionalIterator および ConstexprIterator(C++26以降)[編集]
const_iterator const value_type への LegacyBidirectionalIterator および ConstexprIterator(C++26以降)[編集]
reverse_iterator std::reverse_iterator<iterator>[編集]
const_reverse_iterator std::reverse_iterator<const_iterator>[編集]
node_type (C++17以降) コンテナのノードを表す ノードハンドル の特殊化[編集]
insert_return_type (C++17 以降) node_type の挿入結果を記述する型。以下の特殊化である

template<class Iter, class NodeType>
struct /*未規定*/
{
    Iter     position;
    bool     inserted;
    NodeType node;
};

テンプレート引数 iteratornode_type でインスタンス化される。[編集]

[編集] メンバクラス

value_type 型のオブジェクトを比較する
(クラス) [編集]

[編集] メンバ関数

mapを構築する
(公開メンバ関数) [編集]
mapを破棄する
(公開メンバ関数) [編集]
コンテナに値を代入する
(公開メンバ関数) [編集]
関連付けられたアロケータを返す
(公開メンバ関数) [編集]
要素アクセス
境界チェック付きで指定された要素にアクセスする
(public メンバ関数) [編集]
指定された要素にアクセスまたは挿入する
(public メンバ関数) [編集]
イテレータ
先頭へのイテレータを返す
(public メンバ関数) [編集]
(C++11)
末尾へのイテレータを返す
(public メンバ関数) [編集]
先頭への逆イテレータを返す
(public メンバ関数) [編集]
(C++11)
末尾への逆イテレータを返す
(public メンバ関数) [編集]
容量
コンテナが空かどうかをチェックする
(public メンバ関数) [編集]
要素数を返す
(public メンバ関数) [編集]
可能な最大要素数を返す
(public メンバ関数) [編集]
変更
内容をクリアする
(公開メンバ関数) [編集]
要素 またはノード(C++17以降)を挿入する
(公開メンバ関数) [編集]
要素の範囲を挿入する
(公開メンバ関数) [編集]
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する
(public member function) [編集]
(C++11)
要素を直接構築する
(公開メンバ関数) [編集]
ヒントを使用して要素を直接構築する
(公開メンバ関数) [編集]
キーが存在しない場合はインプレースで挿入し、キーが存在する場合は何もしない
(public member function) [編集]
要素を削除する
(公開メンバ関数) [編集]
内容を交換する
(public メンバ関数) [編集]
(C++17)
コンテナからノードを抽出する
(公開メンバ関数) [編集]
(C++17)
他のコンテナからノードを連結する
(公開メンバ関数) [編集]
検索
特定のキーに一致する要素の数を返す
(公開メンバ関数) [編集]
特定のキーを持つ要素を検索する
(公開メンバ関数) [編集]
(C++20)
コンテナが特定のキーを持つ要素を含むか確認する
(公開メンバ関数) [編集]
特定のキーに一致する要素の範囲を返す
(公開メンバ関数) [編集]
指定されたキーより小さくない最初の要素へのイテレータを返す
(公開メンバ関数) [編集]
指定されたキーより大きい最初の要素へのイテレータを返す
(公開メンバ関数) [編集]
監視
キーを比較する関数を返す
(公開メンバ関数) [編集]
value_type 型のオブジェクト内のキーを比較する関数を返す
(公開メンバ関数) [編集]

[編集] 非メンバ関数

(C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20)
2つのmapの値を辞書式比較する
(関数テンプレート) [編集]
std::swap アルゴリズムを特殊化する
(関数テンプレート) [編集]
特定の基準を満たすすべての要素を削除する
(関数テンプレート) [編集]

推論補助

(C++17以降)

[編集] ノート

機能テストマクロ 規格 機能
__cpp_lib_containers_ranges 202202L (C++23) コンテナのRangeコンストラクタとRange挿入
__cpp_lib_constexpr_containers 202502L (C++26) constexpr std::map

[編集]

#include <iostream>
#include <map>
#include <string>
#include <string_view>
 
void print_map(std::string_view comment, const std::map<std::string, int>& m)
{
    std::cout << comment;
    // Iterate using C++17 facilities
    for (const auto& [key, value] : m)
        std::cout << '[' << key << "] = " << value << "; ";
 
// C++11 alternative:
//  for (const auto& n : m)
//      std::cout << n.first << " = " << n.second << "; ";
//
// C++98 alternative:
//  for (std::map<std::string, int>::const_iterator it = m.begin(); it != m.end(); ++it)
//      std::cout << it->first << " = " << it->second << "; ";
 
    std::cout << '\n';
}
 
int main()
{
    // Create a map of three (string, int) pairs
    std::map<std::string, int> m{{"CPU", 10}, {"GPU", 15}, {"RAM", 20}};
 
    print_map("1) Initial map: ", m);
 
    m["CPU"] = 25; // update an existing value
    m["SSD"] = 30; // insert a new value
    print_map("2) Updated map: ", m);
 
    // Using operator[] with non-existent key always performs an insert
    std::cout << "3) m[UPS] = " << m["UPS"] << '\n';
    print_map("4) Updated map: ", m);
 
    m.erase("GPU");
    print_map("5) After erase: ", m);
 
    std::erase_if(m, [](const auto& pair){ return pair.second > 25; });
    print_map("6) After erase: ", m);
    std::cout << "7) m.size() = " << m.size() << '\n';
 
    m.clear();
    std::cout << std::boolalpha << "8) Map is empty: " << m.empty() << '\n';
}

出力

1) Initial map: [CPU] = 10; [GPU] = 15; [RAM] = 20;
2) Updated map: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30;
3) m[UPS] = 0
4) Updated map: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30; [UPS] = 0;
5) After erase: [CPU] = 25; [RAM] = 20; [SSD] = 30; [UPS] = 0;
6) After erase: [CPU] = 25; [RAM] = 20; [UPS] = 0;
7) m.size() = 3
8) Map is empty: true

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 230 C++98 KeyCopyConstructible であることを要求されていなかった
(Key 型のキーが構築できない可能性があった)
Key には次のことも要求される
CopyConstructible であること
LWG 464 C++98 constなmapへのキーによるアクセスが不便だった at関数が提供された

[編集] 関連項目

キーによってソートされたキーと値のペアのコレクション
(クラステンプレート) [編集]
キーによってハッシュ化されたキーと値のペアのコレクション、キーはユニーク
(クラステンプレート) [編集]
(C++23)
ユニークなキーによってソートされたキーと値のペアのコレクションを提供するために2つのコンテナを適合させる
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)