class template
std::multimap
namespace std {
template <
class Key,
class T,
class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T> >
>
class multimap;
namespace pmr {
template <class Key, class T, class Compare = less<Key>>
using multimap = std::multimap<Key, T, Compare,
polymorphic_allocator<pair<const Key, T>>>; // C++17から
}
}
multimap
コンテナは 4 つのテンプレートパラメータを取る。
概要
multimap
は同一キーの要素を複数格納できる連想コンテナの一種であり、キーとそれに対応する値を格納する。
連想コンテナは特にそれらキーによる要素アクセスが効率的になるようよう設計されたコンテナである(要素への相対位置または絶対位置によるアクセスが効率的であるシーケンシャルコンテナとは異なる)。
内部的には、multimap
内の要素は、コンテナの構築時に設定された狭義の弱順序基準に従って小さいものから大きいものへとソートされる。
multimap
は一般的に、二分木として実装される。従って、連想コンテナである multimap
の主な特性は以下の通りである。
- 要素の値はキーと値の
pair
型である。
- 要素は常に狭義の弱順序に従う。
- 挿入操作はイテレータや要素の参照に影響を与えない。
このコンテナクラスは、双方向イテレータをサポートする。
テンプレートパラメータ
Key
: キーの型。キーの値の大小に従って自動的に並び替えられる。
T
: 値の型。
pair<const Key, T>
: 要素の型。
Compare
: 比較クラス。このクラスは 2 つの引数(同じ型)をとり bool
値を返す。狭義の弱順序において a
が b
よりも前の場所に位置づけられる場合に true
である。これはクラスが関数呼び出しオブジェクトを実装したクラスであっても良いし関数ポインタであっても良い(例は コンストラクタ を参照)。これは、operator<()
を適用( a < b
)したときと同じ値を返す less<Key>
がデフォルトである。
Allocator
: ストレージアロケーションモデルを決定づける、アロケータオブジェクトの型である。デフォルトでは、pair<const Key, T>
への allocator
クラステンプレート(これは値に依存しないシンプルなメモリ確保モデルを定義する)が使われる。
メンバ関数
構築・破棄
イテレータ
名前 |
説明 |
対応バージョン |
begin |
先頭を指すイテレータを取得する |
|
cbegin |
先頭を指す読み取り専用イテレータを取得する |
C++11 |
end |
末尾の次を指すイテレータを取得する |
|
cend |
末尾の次を指す読み取り専用イテレータを取得する |
C++11 |
rbegin |
末尾を指す逆イテレータを取得する |
|
crbegin |
末尾を指す読み取り専用逆イテレータを取得する |
C++11 |
rend |
先頭の前を指す逆イテレータを取得する |
|
crend |
先頭の前を指す読み取り専用逆イテレータを取得する |
C++11 |
領域
コンテナの変更
要素アクセス
オブザーバー
メンバ型
名前 |
説明 |
対応バージョン |
key_type |
キーの型。テンプレートパラメータ Key 。 |
|
value_type |
要素の型。std::pair<const Key, T> 。 |
|
mapped_type |
値の型。テンプレートパラメータ T 。 |
|
key_compare |
キー値の大小関係を判定する二項述語の型。テンプレートパラメータ Compare 。 |
|
allocator_type |
アロケータの型。テンプレートパラメータ Allocator 。 |
|
reference |
要素value_type への参照型。value_type& 。 |
|
const_reference |
要素value_type へのconst 参照型。const value_type& 。 |
|
iterator |
双方向イテレータ。 |
|
const_iterator |
読み取り専用双方向イテレータ。 |
|
size_type |
要素数を表す符号なし整数型。difference_type で表現可能な非負整数(0以上の整数)を表すことが可能。(通常は size_t ) |
|
difference_type |
同一のコンテナを指す iterator の差を表す符号付き整数型(通常は ptrdiff_t )
std::iterator_traits<iterator>::difference_type 、および、std::iterator_traits<const_iterator>::difference_type と同じ。 |
|
pointer |
要素 value_type へのポインタ。 C++03 : typename Allocator::pointer 。 C++11以降 : typename allocator_traits<Allocator>::pointer 。 |
|
const_pointer |
要素 value_type へのconst ポインタ。 C++03 : typename Allocator::const_pointer 。 C++11以降 : typename allocator_traits<Allocator>::const_pointer 。 |
|
reverse_iterator |
逆順双方向イテレータ。std::reverse_iterator<iterator> 。 |
|
const_reverse_iterator |
読み取り専用逆順双方向イテレータ。std::reverse_iterator<const_iterator> 。 |
|
node_type |
node_handle クラステンプレートの特殊化。 |
C++17 |
非メンバ関数
比較演算子
入れ替え
名前 |
説明 |
対応バージョン |
swap |
2つのmultimap オブジェクトを入れ替える |
|
要素削除
名前 |
説明 |
対応バージョン |
erase_if |
指定した条件に合致する要素とその分の領域を、コンテナから削除する |
C++20 |
推論補助
例
C++03版
#include <iostream>
#include <map>
#include <utility>
int main()
{
// charをキー、intを値として扱う連想配列
typedef std::multimap<char, int> MCI; // C++03 では型名を何度も書く必要があるので typedef しておく
MCI m;
// 挿入
m.insert(MCI::value_type('c', 30));
m.insert(MCI::value_type('a', 10));
m.insert(MCI::value_type('b', 20));
m.insert(MCI::value_type('a', 40)); // キー'a'に対応する値が2つ
// 同じキーを持つ値の数を取得する
MCI::size_type count = m.count('a'); // count == 2
std::cout << "count = " << count << std::endl;
// キー`a`を持つ値を列挙する
std::pair<MCI::iterator, MCI::iterator> p = m.equal_range('a');
for (MCI::iterator it = p.first; it != p.second; ++it) {
std::cout << it->second << std::endl;
}
}
C++11版
出力(C++03版、C++11版共通)
count = 2
10
40
参照