Namespaces
Variants

std:: map

From ja.cppreference.net
ヘッダーで定義 <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 を使用してソートされます。検索、削除、挿入操作の計算量は対数時間です。マップは通常 Red–black trees として実装されます。

std::mapのイテレータはキーの昇順で反復処理を行います。ここでの昇順は構築時に使用された比較関数によって定義されます。つまり、以下の場合

  • m 、 std::map
  • it_l および it_r 、 m への逆参照可能なイテレータで、 it_l < it_r を満たすもの。

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

標準ライブラリが Compare 要件を使用するすべての箇所では、一意性は同値関係を用いて決定されます。大まかに言えば、二つのオブジェクト a と b は、互いに他方より小さくない場合(つまり ! 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 LegacyBidirectionalIterator および ConstexprIterator(C++26以降) から value_type
const_iterator LegacyBidirectionalIterator および ConstexprIterator(C++26以降) から const value_type
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 /* unspecified */
{
    Iter     position;
    bool     inserted;
    NodeType node;
};

テンプレート引数 iterator と node_type でインスタンス化されます。

メンバークラス

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

メンバー関数

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

非メンバー関数

(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) コンテナのためのレンジ構築と挿入
__cpp_lib_constexpr_map 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;
    // C++17の機能を使用した反復処理
    for (const auto& [key, value] : m)
        std::cout << '[' << key << "] = " << value << "; ";
// C++11代替案:
//  for (const auto& n : m)
//      std::cout << n.first << " = " << n.second << "; ";
//
// C++98代替案:
//  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()
{
    // 3つの(文字列、整数)ペアのマップを作成
    std::map<std::string, int> m{{"CPU", 10}, {"GPU", 15}, {"RAM", 20}};
    print_map("1) 初期マップ: ", m);
    m["CPU"] = 25; // 既存の値を更新
    m["SSD"] = 30; // 新しい値を挿入
    print_map("2) 更新後のマップ: ", m);
    // 存在しないキーでのoperator[]使用は常に挿入を実行
    std::cout << "3) m[UPS] = " << m["UPS"] << '\n';
    print_map("4) 更新後のマップ: ", m);
    m.erase("GPU");
    print_map("5) 削除後: ", m);
    std::erase_if(m, [](const auto& pair){ return pair.second > 25; });
    print_map("6) 削除後: ", m);
    std::cout << "7) m.size() = " << m.size() << '\n';
    m.clear();
    std::cout << std::boolalpha << "8) マップは空: " << m.empty() << '\n';
}

出力:

1) 初期マップ: [CPU] = 10; [GPU] = 15; [RAM] = 20;
2) 更新後のマップ: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30;
3) m[UPS] = 0
4) 更新後のマップ: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30; [UPS] = 0;
5) 削除後: [CPU] = 25; [RAM] = 20; [SSD] = 30; [UPS] = 0;
6) 削除後: [CPU] = 25; [RAM] = 20; [UPS] = 0;
7) m.size() = 3
8) マップは空: true

不具合報告

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

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

関連項目

キー-値ペアのコレクション、キーでソート
(クラステンプレート)
キー-値ペアのコレクション、キーでハッシュ、キーは一意
(クラステンプレート)
(C++23)
2つのコンテナを適合させて、一意のキーでソートされたキー-値ペアのコレクションを提供
(クラステンプレート)