• <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==了。


            9191精品国产免费久久| 久久久久亚洲av成人无码电影| 大香网伊人久久综合网2020| 亚洲色欲久久久综合网东京热| 精品久久久无码中文字幕| 久久久久亚洲av成人无码电影| 亚洲精品美女久久久久99小说| 亚洲国产精品综合久久网络| 久久人人爽人人爽人人片AV高清 | 一本大道久久a久久精品综合 | 久久久久亚洲AV无码专区桃色| 国产午夜福利精品久久| 三级三级久久三级久久 | 欧美无乱码久久久免费午夜一区二区三区中文字幕| 奇米影视7777久久精品人人爽| 国产∨亚洲V天堂无码久久久| 久久久久亚洲av毛片大| 97久久久久人妻精品专区| 偷偷做久久久久网站| 天天做夜夜做久久做狠狠| 色综合久久88色综合天天| 亚洲va久久久噜噜噜久久| 色狠狠久久综合网| 久久久久久久波多野结衣高潮| 99久久www免费人成精品| 国产成人久久777777| 精品久久久久久国产91| 国产99久久久国产精免费| 精品国产91久久久久久久a| 久久香蕉国产线看观看猫咪?v| 国产69精品久久久久9999| 伊人久久国产免费观看视频| 久久亚洲精品成人无码网站| 91精品国产乱码久久久久久| 91久久精品国产91性色也| 99久久国产亚洲综合精品| 久久久久久久91精品免费观看| 久久综合亚洲色HEZYO社区| 亚洲AV日韩AV永久无码久久| 91精品国产综合久久香蕉| 亚洲国产另类久久久精品黑人|