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


            久久久久久国产a免费观看黄色大片| 无码人妻久久一区二区三区蜜桃 | 久久久国产99久久国产一| 欧美伊人久久大香线蕉综合69 | 日韩久久久久中文字幕人妻| 少妇被又大又粗又爽毛片久久黑人| 久久久久国产一区二区三区| 久久国产精品无| 狠狠色噜噜狠狠狠狠狠色综合久久| 国内精品伊人久久久久网站| 精品久久久久成人码免费动漫| 久久国产精品99久久久久久老狼 | 亚洲精品乱码久久久久久按摩| 久久亚洲精品中文字幕三区| 无码任你躁久久久久久老妇App| 久久综合九色综合精品| 中文国产成人精品久久不卡| A级毛片无码久久精品免费| 久久久久久九九99精品| 亚洲精品国精品久久99热| 久久精品国产免费一区| 久久午夜无码鲁丝片秋霞| 精品久久久久久国产免费了| 狠狠色婷婷久久一区二区三区| 四虎久久影院| 久久本道综合久久伊人| 久久夜色精品国产亚洲| 国产成人久久AV免费| 99久久夜色精品国产网站| 欧美色综合久久久久久| 色8激情欧美成人久久综合电| 久久精品无码一区二区日韩AV| 久久―日本道色综合久久| AV色综合久久天堂AV色综合在 | 91精品国产91久久久久久| 久久99免费视频| 国产精品美女久久久免费| 国产99久久久国产精免费| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久亚洲2019中文字幕| 久久久久亚洲AV成人网|