typ*_*def 69
A 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;
}
Run Code Online (Sandbox Code Playgroud)
A std::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;
}
Run Code Online (Sandbox Code Playgroud)
的std::set
是像一个std::map
,但它不存储关联到一个值的密钥.它仅存储密钥类型,并确保它在集合中是唯一的.
你也有std::multiset
,遵循相同的模式.
所有这些容器都提供带有find/equal_range的O(log(n))访问.
Bo *_*son 48
multimap存储(key,value)对,其中键和值可以多次出现.
该map<key, set<value>>
会只针对特定的密钥存储一次每个值.要做到这一点,它必须能够比较值,而不仅仅是键.
如果比较相等的值相等,或者您希望单独存储它们,则取决于您的应用程序.也许它们包含不同的字段但不参与集合的比较.
Luk*_*hne 13
map::insert
Run Code Online (Sandbox Code Playgroud)
因为map
容器不允许重复键值,所以插入操作检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是,则不插入该元素并且不以任何方式更改其映射值.
另一方面
multimap::insert
Run Code Online (Sandbox Code Playgroud)
可以使用相同的键插入任意数量的项目.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/