unordered map的key能重复么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unordered map的key能重复么相关的知识,希望对你有一定的参考价值。

学习数据结构的时候 偶然得知有个unordered_map,以前没有用过,查了查相关内容,据说效率比map高出很多,而且耗资源也少,研究一下
至于具体效率咋样我就不去验证了,网上太多了
参考:http://blog.csdn.net/whizchen/article/details/9286557
关键是
unordered_map与map的区别
boost::unordered_map, 它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照operator< 定义的大小排序。
而boost::unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同。所以,对unordered_map进行遍历,结果是无序的。
用法的区别就是,stl::map 的key需要定义operator< 。 而boost::unordered_map需要定义hash_value函数并且重载operator==。对于内置类型,如string,这些都不用操心。对于自定义的类型做key,就需要自己重载operator== 或者hash_value()了。
最后,说,当不需要结果排好序时,最好用unordered_map。

linux下使用
普通的key就不说了和map一样
看一下用sockaddr_in 作为key的方法
参考技术A #include <string>
#include <iostream>
#include <unordered_map>

typedef std::unordered_map<std::string, std::string> MapType;
typedef std::pair<std::string, std::string> Pair;

int main()

    MapType mp;

    mp.insert(Pair("010", "Beijing"));
    mp.insert(Pair("020", "Shanghai"));
    mp.insert(Pair("027", "Chengdu"));

    for (const auto &n : mp)
        std::cout << "Area Code:[" << n.first << "] Name:[" << n.second << "]\\n";

    // std::pair<MapType::iterator, bool> ret = mp.insert(Pair("010", "Tongzhou"));
    auto ret = mp.insert(Pair("010", "Tongzhou"));
    if (!ret.second)
        std::cout << "Inserting failed!\\n";
    for (const auto &n : mp)
        std::cout << "Area Code:[" << n.first << "] Name:[" << n.second << "]\\n";

    return 0;

验证结果:不能重复

19.允许重复的unordered_map

 1 #include <string>
 2 #include <iostream>
 3 //查询性能最高
 4 //允许重复的,hash_map
 5 #include <unordered_map>
 6 #include <algorithm>
 7 using namespace std;
 8 
 9 
10 void main()
11 {
12     //允许重复的映射
13     unordered_multimap<string, double>mymap{ {"a1",113},{ "a2",143 },{ "a3",1123 } };
14 
15     mymap.insert(pair<string, double>("a4", 345));
16     mymap.insert(pair<string, double>("a4", 315));
17     mymap.insert(pair<string, double>("a4", 325));
18     mymap.insert(pair<string, double>("a4", 335));
19 
20     /*mymap.insert(unordered_multimap<string, double>::value_type("a5", 3425));*/
21 
22     /*for (auto i : mymap)
23     {
24         cout << i.first << "  " << i.second << endl;
25     }*/
26 
27     /*auto it = mymap.find("a1");
28     if (it != mymap.end())
29     {
30         cout << it->second << endl;
31     }*/
32 
33     //查找所有
34     auto it = mymap.equal_range("a4");
35 
36     for_each(it.first, it.second, [](unordered_multimap<string, double>::value_type &x) {cout << x.first << "  " << x.second << endl; });
37     cin.get();
38 }

 

以上是关于unordered map的key能重复么的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ std::unordered_map 中预分配桶

unordered_map/set自定义哈希函数

c++ unordered_map 自定义key

unordered_map和map的区别

unordered_map 与 map 的对比(转)

关联容器map的使用