我发现它们有一个键和多个唯一的值。
Answers:
多图存储(键,值)对,其中键和值都可以出现几次。
在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;
}
Astd::multimap
等于a 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))访问。
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> >
。