1つのキーと複数の値が一意であることがわかりました。
回答:
マルチマップには、キーと値の両方が複数回出現する可能性がある(key、value)のペアが格納されます。
map<key, set<value>>
のみ、特定のキーの後にそれぞれの値を格納します。そのためには、キーだけでなく、値を比較できる必要があります。
等しいと比較する値が等しいかどうか、またはとにかくそれらを別々に保存したいかどうかは、アプリケーションによって異なります。おそらく、それらには異なるフィールドが含まれていますが、セットの比較には参加していません。
std::multimap<key, value>
同じキーを複数回表示できますstd::map<key, whatever>
が、の一意性が必要ですkey
。
Astd::map
は連想コンテナであり、タイプ値に一意のキーを関連付けることができます。例えば、
void someFunction()
{
typedef std::map<std::string, int> MapType;
MapType myMap;
// insertion
myMap.insert(MapType::value_type("test", 42));
myMap.insert(MapType::value_type("other-test", 0));
// search
auto it = myMap.find("test");
if (it != myMap.end())
std::cout << "value for " << it->first << " is " << it->second << std::endl;
else
std::cout << "value not found" << std::endl;
}
A std::multimap
はと同じですstd::map
が、キーはもう一意ではありません。したがって、1つの固有のアイテムを見つけるだけでなく、さまざまなアイテムを見つけることができます。例えば、
void someFunction()
{
typedef std::multimap<std::string, int> MapType;
MapType myMap;
// insertion
myMap.insert(MapType::value_type("test", 42));
myMap.insert(MapType::value_type("test", 45));
myMap.insert(MapType::value_type("other-test", 0));
// search
std::pair<auto first, auto second> range = myMap.equal_range("test");
for (auto it = range.first; it != range.second; ++it)
std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}
std::set
以下のようなものですstd::map
が、それは値に関連付けられたキーを格納していません。キータイプのみを保存し、セット内で一意であることを保証します。
あなたも持っています std::multiset
、それは同じパターンに従います。
これらのコンテナはすべて、find / equal_rangeを使用してO(log(n))アクセスを提供します。
std::pair<auto first, auto second> range = myMap.equal_range("test");
は機能しませんerror: 'auto' not allowed in template argument
。const auto range = myMap.equal_range("test")
代わりに使用してください。
map::insert
map
コンテナではキー値の重複が許可されていないため、挿入操作では、挿入された各要素について、同じキー値を持つ別の要素がコンテナにすでに存在するかどうかがチェックされます。存在する場合、要素は挿入されず、マップされた値は変更されません。
一方
multimap::insert
同じキーでいくつでもアイテムを挿入できます。
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
後者では、値を(経由operator<
または比較関数を介して)順序付けできる必要がありますが、前者はそうではありません。
T
順序付けされていないタイプがあるとします。これを使用してを作成するstd::multimap<U, T>
ことはできますが、を作成するために使用することはできませんstd::map<U, std::set<T> >
。