• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            今天看到 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。


            其實,stl::map對于與java中的TreeMap,而boost::unordered_map對應于java中的HashMap。


            stl::map

            1. #include<string>
            2. #include<iostream>
            3. #include<map>
            4. using namespace std;
            5. struct person
            6. {
            7. string name;
            8. int age;
            9. person(string name, int age)
            10. {
            11. this->name = name;
            12. this->age = age;
            13. }
            14. bool operator < (const person& p) const
            15. {
            16. return this->age < p.age;
            17. }
            18. };
            19. map<person,int> m;
            20. int main()
            21. {
            22. person p1("Tom1",20);
            23. person p2("Tom2",22);
            24. person p3("Tom3",22);
            25. person p4("Tom4",23);
            26. person p5("Tom5",24);
            27. m.insert(make_pair(p3, 100));
            28. m.insert(make_pair(p4, 100));
            29. m.insert(make_pair(p5, 100));
            30. m.insert(make_pair(p1, 100));
            31. m.insert(make_pair(p2, 100));
            32. for(map<person, int>::iterator iter = m.begin(); iter != m.end(); iter++)
            33. {
            34. cout<<iter->first.name<<"\t"<<iter->first.age<<endl;
            35. }
            36. return 0;
            37. }

             

            output:

            Tom1 20
            Tom3 22
            Tom4 23
            Tom5 24


            operator<的重載一定要定義成const。因為map內部實現時調用operator<的函數好像是const。

            由于operator<比較的只是age,所以因為Tom2和Tom3的age相同,所以最終結果里面只有Tom3,沒有Tom2


            boost::unordered_map

            1. #include<string>
            2. #include<iostream>
            3. #include<boost/unordered_map.hpp>
            4. using namespace std;
            5. struct person
            6. {
            7. string name;
            8. int age;
            9. person(string name, int age)
            10. {
            11. this->name = name;
            12. this->age = age;
            13. }
            14. bool operator== (const person& p) const
            15. {
            16. return name==p.name && age==p.age;
            17. }
            18. };
            19. size_t hash_value(const person& p)
            20. {
            21. size_t seed = 0;
            22. boost::hash_combine(seed, boost::hash_value(p.name));
            23. boost::hash_combine(seed, boost::hash_value(p.age));
            24. return seed;
            25. }
            26. int main()
            27. {
            28. typedef boost::unordered_map<person,int> umap;
            29. umap m;
            30. person p1("Tom1",20);
            31. person p2("Tom2",22);
            32. person p3("Tom3",22);
            33. person p4("Tom4",23);
            34. person p5("Tom5",24);
            35. m.insert(umap::value_type(p3, 100));
            36. m.insert(umap::value_type(p4, 100));
            37. m.insert(umap::value_type(p5, 100));
            38. m.insert(umap::value_type(p1, 100));
            39. m.insert(umap::value_type(p2, 100));
            40. for(umap::iterator iter = m.begin(); iter != m.end(); iter++)
            41. {
            42. cout<<iter->first.name<<"\t"<<iter->first.age<<endl;
            43. }
            44. return 0;
            45. }

            輸出

             

            Tom1 20
            Tom5 24
            Tom4 23
            Tom2 22
            Tom3 22


            必須要自定義operator==和hash_value。 重載operator==是因為,如果兩個元素的hash_value的值相同,并不能斷定這兩個元素就相同,必須再調用operator==。 當然,如果hash_value的值不同,就不需要調用operator==了。


            91精品国产91久久综合| 人人妻久久人人澡人人爽人人精品| 久久久久人妻一区精品色| 久久中文娱乐网| 色婷婷综合久久久久中文字幕| 99精品国产综合久久久久五月天 | 久久最新免费视频| 亚洲日韩中文无码久久| 久久久久久久尹人综合网亚洲| 久久综合久久性久99毛片| 久久97精品久久久久久久不卡| 久久国产精品免费| 99国产精品久久久久久久成人热| 亚洲精品NV久久久久久久久久| 久久婷婷五月综合国产尤物app | 久久青青草视频| 亚洲一区中文字幕久久| 久久人人爽爽爽人久久久| 久久影院亚洲一区| 国内精品久久久久久久涩爱 | 久久av免费天堂小草播放| 久久国产热精品波多野结衣AV| 狠狠色丁香婷婷久久综合五月 | 亚洲欧美一级久久精品| 久久精品九九亚洲精品天堂| 777午夜精品久久av蜜臀| 久久精品国产福利国产琪琪| 一级做a爰片久久毛片16| 成人综合伊人五月婷久久| 亚洲乱码中文字幕久久孕妇黑人 | 国产精品欧美久久久久无广告 | 无遮挡粉嫩小泬久久久久久久 | 久久国产香蕉视频| 国产亚州精品女人久久久久久| 精品九九久久国内精品| 久久久久久无码Av成人影院| 久久久久久夜精品精品免费啦| 777午夜精品久久av蜜臀| 日产精品久久久一区二区| 日日躁夜夜躁狠狠久久AV| 新狼窝色AV性久久久久久|