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

104
我发现它们有一个唯一的键和多个值。
4个回答

85

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::multimapstd::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,它遵循相同的模式。

所有这些容器都提供了 O(log(n)) 的查找 / 区间查找访问。


6
在multimap函数中,这行代码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
2
mapType?第4行不应该是MapType吗? - lolololol ol
不确定谁是第一个,但其中一个显然是另一个的复制粘贴:https://www.cppbuzz.com/What-is-difference-between-map-and-multimap - 463035818_is_not_a_number
1
啊哈,cppbuzz正在抓取StackOverflow还是怎么回事?我在几年前自己编写了这个答案,当时我还在日常编写C ++代码。第四行确实有一个错别字,谢谢@lololololol的指正。 - typedef
1
(他们的复制/粘贴失败了,甚至在模板std::map声明中都没有显示类型:std::map<std::string, int>) - typedef
@typedef 别人抓取你的工作是一个严重的问题。在这种情况下,正确的做法是使用“联系我们”表单。请参见https://meta.stackexchange.com/a/200178。 - L. F.

58

多重映射存储键值对,其中键和值均可以出现多次。

map<key, set<value>> 只会为特定的键存储每个值一次。为了做到这一点,它将需要比较值,而不仅仅是键。

这取决于您的应用程序是否认为相等的值是等价的,或者您是否希望将它们分别存储。也许它们包含不参与集合比较的不同字段。


6
所以,std::multimap<key, value> 就像是 std::map<key, std::multiset<value>>,它们之间的区别在于后者的值是排序的。没错吧? - superK
3
不,std::multimap<key, value> 允许同一个键出现多次,而 std::map<key, whatever> 要求键的唯一性。 - Yixing Liu

14

这是一个关于map和multimap的区别以及内部工作原理的好链接。链接 - Rndp13

10
后者不要求值可以被排序(通过运算符 operator< 或比较函数),而前者需要。

看起来 operator< 在 map 和 multimap 上的工作方式是相同的?http://en.cppreference.com/w/cpp/container/map/operator_cmp - johnbakers
是的,但我的回答涉及到值的排序。假设您有一个没有排序的类型T。您可以使用它来创建一个std::multimap<U, T>,但您不能使用它来创建一个std::map<U, std::set<T>> - Björn Pollex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接