std :: multimap <key,value>和std :: map <key,std :: set <value>>有什么区别

我发现他们有一个唯一的键和多个值。

multimap存储键(key)和值(value)可以多次出现的对(key,value)。

map<key, set<value>>将只存储一个特定键的值。 要做到这一点,它必须能够比较值,而不仅仅是键。

这取决于你的应用程序,如果比较相等的值是相等的,或者如果你希望分开存储它们。 也许他们包含的领域是不同的,但不参与比较的设置。

std::map是一个关联容器,它允许你有一个与你的types值相关联的唯一键。 例如,

 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; } 

一个std::multimap等于一个std::map ,但是你的密钥不再是唯一的。 因此,您可以find一系列项目,而不是只find一个独特的项目。 例如,

 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 ,但不存储与某个值相关联的键。 它只存储密钥types,并确保它在集合中是唯一的。

你也有std::multiset ,它遵循相同的模式。

所有这些容器提供一个O(log(n))访问与他们的find / equal_range。

 map::insert 

因为map容器不允许重复的键值,所以插入操作检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是这样的话,则不插入该元素并且其映射值不以任何方式改变。

另一方面

 multimap::insert 

可以使用相同的密钥插入任意数量的项目。

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/

后者要求可以对数值进行sorting(通过operator<或比较函数),而前者则不是。