• map vs hash_map


    1. map, multimap, set, multiset

    g++ 中 map, multimap, set, multiset 由红黑树实现

    map: bits/stl_map.h

    multimap: bits/stl_multimap.h

    set: bits/stl_set.h

    multiset: bits/stl_multiset.h

    红黑树类——_Rb_tree: bits/stl_tree.h

    若要分析红黑树的实现阅读 bits/stl_tree.h 即可

    2. unordered_map, unordered_multimap, unordered_set, unordered_multiset(C++ 11)

    g++ 中 unordered_map, unordered_multimap, unordered_set, unordered_multiset 由哈希表实现,只是内部使用散列表代替了二叉树实现,因此查找复杂度由数降为常数。

     

     

    4.1 hash_map和map的区别在哪里?

    • 构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).
    • 存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。

    4.2 什么时候需要用hash_map,什么时候需要用map?

    总 体来说,hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n) 小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且 hash_map的构造速度较慢。

    现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。

    这里还有个关于hash_map和map的小故事,看看:http://dev.csdn.net/Develop/article/14/14019.shtm

    4.3 如何在hash_map中加入自己定义的类型?

    你只要做两件事, 定义hash函数,定义等于比较函数。下面的代码是一个例子:

    #include <hash_map>

    #include <string>

    #include <iostream>

     

    using namespace std;

    //define the class

    class ClassA{

            public:

            ClassA(int a):c_a(a){}

            int getvalue()const { return c_a;}

            void setvalue(int a){c_a=a;}

            private:

            int c_a;

    };

     

    //1 define the hash function

    struct hash_A{

            size_t operator()(const class ClassA & A)const{

                    //  return  hash<int>(classA.getvalue());

                    return A.getvalue();

            }

    };

     

    //2 define the equal function

    struct equal_A{

            bool operator()(const class ClassA & a1, const class ClassA & a2)const{

                    return  a1.getvalue() == a2.getvalue();

            }

    };

     

    int main()

    {

            hash_map<ClassA, string, hash_A, equal_A> hmap;

            ClassA a1(12);

            hmap[a1]="I am 12";

            ClassA a2(198877);

            hmap[a2]="I am 198877";

           

            cout<<hmap[a1]<<endl;

            cout<<hmap[a2]<<endl;

            return 0;

    }

     

     

    I am 12

    I am 198877

    4.4如何用hash_map替换程序中已有的map容器?

    这个很容易,但需要你有良好的编程风格。建议你尽量使用typedef来定义你的类型:

    typedef map<Key, Value> KeyMap;

    当你希望使用hash_map来替换的时候,只需要修改:

    typedef hash_map<Key, Value> KeyMap;

    其他的基本不变。当然,你需要注意是否有Key类型的hash函数和比较函数。

    4.5为什么hash_map不是标准的?

    具体为什么不 是标准的,我也不清楚,有个解释说在STL加入标准C++之时,hash_map系列当时还没有完全实现,以后应该会成为标准。如果谁知道更合理的解释,也希望告诉我。但我想表达的是,正是因为hash_map不是标准的,所以许多平台上安装了g++编译器,不一定有hash_map的实现。我就遇到了这样的例子。因此在使用这些非标准库的时候,一定要事先测试。另外,如果考虑到平台移植,还是少用为佳。

    4.6 有学习使用hash_map的建议吗?

    hash中文是哈希,也成为散列,听见别人说散列容器不要埋怨自己孤陋寡闻。了解hash系列,你还可以看看这篇文章:effective STL 25: 熟悉非标准散列容器, 另外建议查看源代码。如果还有问题,那么你可以在STL论坛上提问,会有高手回答你的。

  • 相关阅读:
    sql 将某列转换成一个字符串 for xml path用法
    IAsyncResult 接口异步 和 匿名委托
    存储过程和sql语句的优缺点
    ADO.net中常用的对象有哪些?分别描述一下。
    ASP.Net页面生命周期
    请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
    .net常用的传值的方法
    SQL列合并
    程序员的情书!
    程序员的表达!
  • 原文地址:https://www.cnblogs.com/diegodu/p/3792797.html
Copyright © 2020-2023  润新知