我发现他们有一个键和多个值是唯一的。
答案 0 :(得分:67)
std::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;
}
std::multimap
等于std::map
,但您的密钥不再是唯一的。因此,您可以找到一系列项目,而不只是找到一个唯一的项目。
例如,
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))访问。
答案 1 :(得分:45)
multimap存储(key,value)对,其中键和值可以多次出现。
map<key, set<value>>
只会为特定密钥存储一次值。要做到这一点,它必须能够比较值,而不仅仅是键。
如果比较相等的值相等,或者您希望单独存储它们,则取决于您的应用程序。也许它们包含不同的字段但不参与集合的比较。
答案 2 :(得分:13)
map::insert
因为map
容器不允许重复的键值,插入操作会检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是,则不插入该元素并将其映射价值不会以任何方式改变。
multimap::insert
可以使用相同的键插入任意数量的项目。
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
答案 3 :(得分:10)
后者要求可以对值进行排序(通过operator<
或比较函数),前者不需要。