std::map
| ヘッダ <map> で定義 |
||
| template< class Key, |
(1) | |
| namespace pmr { template< |
(2) | (C++17以降) |
std::mapは、ユニークなキーを持つキーと値のペアを格納する、ソート済み連想コンテナである。キーは比較関数Compareを用いてソートされる。検索、削除、挿入操作は対数時間計算量を持つ。mapは通常、赤黒木として実装される。
std::mapのイテレータは、キーの昇順で走査する。ここでの昇順は、構築時に使用された比較によって定義される。すなわち、
-
std::mapであるm、 - mへの間接参照可能なイテレータit_lとit_rがあり、it_l < it_rであるとき、
m.value_comp()(*it_l, *it_r) == trueが成り立つ(デフォルトの比較を使用する場合、最小から最大へ)。
標準ライブラリがCompare要件を使用する箇所ではどこでも、一意性(uniqueness)は同値関係(equivalence relation)を用いて決定される。平易に言えば、2つのオブジェクトaとbは、どちらも他方より小さいと見なされない場合、つまり!comp(a, b) && !comp(b, a)の場合に、同値(一意ではない)と見なされる。
std::mapは、コンテナ(Container)、アロケータ認識コンテナ(AllocatorAwareContainer)、連想コンテナ(AssociativeContainer)、およびリバーシブルコンテナ(ReversibleContainer)の要件を満たす。
|
|
(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
|
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> |
[編集] メンバクラス
value_type 型のオブジェクトを比較する(クラス) |
[編集] メンバ関数
mapを構築する(公開メンバ関数) | |
mapを破棄する(公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| 関連付けられたアロケータを返す (公開メンバ関数) | |
要素アクセス | |
| 境界チェック付きで指定された要素にアクセスする (public メンバ関数) | |
| 指定された要素にアクセスまたは挿入する (public メンバ関数) | |
イテレータ | |
| (C++11) |
先頭へのイテレータを返す (public メンバ関数) |
| (C++11) |
末尾へのイテレータを返す (public メンバ関数) |
| (C++11) |
先頭への逆イテレータを返す (public メンバ関数) |
| (C++11) |
末尾への逆イテレータを返す (public メンバ関数) |
容量 | |
| コンテナが空かどうかをチェックする (public メンバ関数) | |
| 要素数を返す (public メンバ関数) | |
| 可能な最大要素数を返す (public メンバ関数) | |
変更 | |
| 内容をクリアする (公開メンバ関数) | |
| 要素 またはノード(C++17以降)を挿入する (公開メンバ関数) | |
| (C++23) |
要素の範囲を挿入する (公開メンバ関数) |
| (C++17) |
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する (public member function) |
| (C++11) |
要素を直接構築する (公開メンバ関数) |
| (C++11) |
ヒントを使用して要素を直接構築する (公開メンバ関数) |
| (C++17) |
キーが存在しない場合はインプレースで挿入し、キーが存在する場合は何もしない (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++20) |
特定の基準を満たすすべての要素を削除する (関数テンプレート) |
推論補助 |
(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 | Key が CopyConstructible であることを要求されていなかった( Key 型のキーが構築できない可能性があった) |
Key には次のことも要求されるCopyConstructible であること |
| LWG 464 | C++98 | constなmapへのキーによるアクセスが不便だった |
at関数が提供された |
[編集] 関連項目
| キーによってソートされたキーと値のペアのコレクション (クラステンプレート) | |
| (C++11) |
キーによってハッシュ化されたキーと値のペアのコレクション、キーはユニーク (クラステンプレート) |
| (C++23) |
ユニークなキーによってソートされたキーと値のペアのコレクションを提供するために2つのコンテナを適合させる (クラステンプレート) |