【问题标题】:What's the difference between std::multimap<key, value> and std::map<key, std::set<value> >std::multimap<key, value> 和 std::map<key, std::set<value> 有什么区别?
【发布时间】:2012-01-25 23:42:35
【问题描述】:

我发现他们只有一个键和多个值。

【问题讨论】:

    标签: c++ map containers key-value multimap


    【解决方案1】:

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

    【讨论】:

    • 在多地图功能中,std::pair&lt;auto first, auto second&gt; range = myMap.equal_range("test"); 这一行不起作用,因为error: 'auto' not allowed in template argument。请改用const auto range = myMap.equal_range("test")
    • 地图类型?第4行不应该是MapType吗?
    • 不确定谁是第一个,但显然是另一个的复制粘贴:cppbuzz.com/What-is-difference-between-map-and-multimap
    • 啊,cppbuzz 是在抓取 StackOverflow 还是什么?,我多年前自己写了这个答案,当时我还在用 c++ 进行日常编码。第 4 行确实有错字,谢谢@lolololol
    • (他们的复制/粘贴失败,他们甚至不显示模板 std::map 声明中的类型:std::map<:string int>)
    【解决方案2】:

    multimap 存储成对的 (key, value),其中 key 和 value 都可以出现多次。

    map&lt;key, set&lt;value&gt;&gt; 只会为特定键存储每个值一次。为此,它必须能够比较值,而不仅仅是键。

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

    【讨论】:

    • 所以,一个 std::multimap 就像一个 std::map >,它们的区别在于后面的值是排序的.对吗?
    • 不,std::multimap&lt;key, value&gt; 允许同一个键多次出现,而 std::map&lt;key, whatever&gt; 需要 key 的唯一性。
    【解决方案3】:
    map::insert
    

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

    另一方面

    multimap::insert 
    

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

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

    【讨论】:

    • 关于差异及其内部工作方式的良好链接。 link
    【解决方案4】:

    后者要求值可以排序(通过operator&lt; 或比较函数),前者不需要。

    【讨论】:

    • 看起来 operatoren.cppreference.com/w/cpp/container/map/operator_cmp
    • 是的,但我的回答是指值的顺序。假设您有一个类型为T,它没有排序。您可以使用它来创建std::multimap&lt;U, T&gt;,但不能使用它来创建std::map&lt;U, std::set&lt;T&gt; &gt;
    猜你喜欢
    • 2012-04-18
    • 2013-03-20
    • 2014-03-15
    • 2013-06-24
    • 2023-04-09
    • 2015-10-12
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多