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


Answers:


51

多图存储(键,值)对,其中键和值都可以出现几次。

map<key, set<value>>将只存储一次特定键的每个值。为此,它必须能够比较值,而不仅仅是键。

如果比较的值相等是相等的,还是无论如何都希望分别存储它们,则取决于您的应用程序。也许它们包含不同的字段,但不参与集合的比较。


5
因此,std :: multimap <key,value>类似于std :: map <key,std :: multiset <value>>,它们之间的区别在于后面的值是经过排序的。那正确吗?
2011年

2
不可以,std::multimap<key, value>允许同一个键出现多次,而std::map<key, whatever>需要的唯一性key
宜兴刘

74

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))访问。


6
在多图功能中,此行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")代替。
vancexu 2014年

2
mapType?它不应该是第4行的MapType吗?
lolololol ol 16-10-17

不确定谁是第一人,但一个人显然是另一个人的复制粘贴:cppbuzz.com/What-is-difference-between-map-and-multimap
idclev 463035818 '18

1
啊哈,cppbuzz正在抓取StackOverflow或什么?,几年前我还在用c ++进行日常编码时,我自己写了这个答案。确实有错别字第4行,谢谢@lololololol
typedef

1
(并且他们的复制/粘贴失败,他们甚至没有在模板std :: map声明中显示类型:std :: map <std :: string,int>)
typedef,

13
map::insert

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

另一方面

multimap::insert 

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

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


两者之间的区别及其内部运作方式都很好。链接
Rndp13

10

后者要求可以对值进行排序(通过operator<或比较功能),而前者则不能。


似乎operator <在地图或多地图上的工作原理相同吗?en.cppreference.com/w/cpp/container/map/operator_cmp
johnbakers

是的,但是我的回答是指这些值的顺序。假设您有一个T没有排序的类型。您可以使用它来创建一个std::multimap<U, T>,但不能使用它来创建一个std::map<U, std::set<T> >
比约恩博动
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.