std:: map
|
ヘッダーで定義
<map>
|
||
|
template
<
class
Key,
|
(1) | |
|
namespace
pmr
{
template
<
|
(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
オブジェクトを作成して使用することが可能です。
ただし、
|
(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
|
|
||||
const_pointer
|
|
||||
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以降)
|
コンテナノードを表す node handle の特殊化 | ||||
insert_return_type
(C++17以降)
|
node_type
の挿入結果を記述する型。
template
<
class
Iter,
class
NodeType
>
|
メンバークラス
value_type
型のオブジェクトを比較する
(クラス) |
メンバー関数
map
を構築する
(公開メンバ関数) |
|
map
を破棄する
(公開メンバ関数) |
|
|
コンテナに値を代入する
(公開メンバ関数) |
|
|
関連付けられたアロケータを返す
(公開メンバ関数) |
|
要素アクセス |
|
|
境界チェック付きで指定された要素にアクセス
(公開メンバ関数) |
|
|
指定された要素にアクセスまたは挿入する
(公開メンバ関数) |
|
イテレータ |
|
|
(C++11)
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
(C++11)
|
終端へのイテレータを返す
(公開メンバ関数) |
|
(C++11)
|
先頭を指す逆方向イテレータを返す
(公開メンバ関数) |
|
(C++11)
|
末尾を指す逆イテレータを返す
(公開メンバ関数) |
容量 |
|
|
コンテナが空かどうかをチェックします
(公開メンバ関数) |
|
|
要素数を返す
(公開メンバ関数) |
|
|
格納可能な最大要素数を返す
(公開メンバ関数) |
|
修飾子 |
|
|
内容をクリアする
(公開メンバー関数) |
|
|
要素を挿入する
またはノード
(C++17以降)
(公開メンバ関数) |
|
|
(C++23)
|
要素の範囲を挿入する
(公開メンバ関数) |
|
(C++17)
|
キーが既に存在する場合、要素を挿入するか現在の要素に代入する
(public member function) |
|
(C++11)
|
要素をその場で構築する
(公開メンバ関数) |
|
(C++11)
|
ヒントを使用して要素をその場で構築する
(公開メンバ関数) |
|
(C++17)
|
キーが存在しない場合はその場で挿入し、キーが存在する場合は何もしない
(公開メンバ関数) |
|
要素を削除する
(公開メンバ関数) |
|
|
内容を交換する
(公開メンバ関数) |
|
|
(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++20)
|
特定の条件を満たすすべての要素を削除する
(関数テンプレート) |
推論ガイド |
(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++11)
|
キー-値ペアのコレクション、キーでハッシュ、キーは一意
(クラステンプレート) |
|
(C++23)
|
2つのコンテナを適合させて、一意のキーでソートされたキー-値ペアのコレクションを提供
(クラステンプレート) |