• <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++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            今天看到 boost::unordered_map, 它與 stl::map的區(qū)別就是,stl::map是按照operator<比較判斷元素是否相同,以及比較元素的大小,然后選擇合適的位置插入到樹(shù)中。所以,如果對(duì)map進(jìn)行遍歷(中序遍歷)的話,輸出的結(jié)果是有序的。順序就是按照operator< 定義的大小排序。

            而boost::unordered_map是計(jì)算元素的Hash值,根據(jù)Hash值判斷元素是否相同。所以,對(duì)unordered_map進(jìn)行遍歷,結(jié)果是無(wú)序的。


            用法的區(qū)別就是,stl::map 的key需要定義operator< 。 而boost::unordered_map需要定義hash_value函數(shù)并且重載operator==。對(duì)于內(nèi)置類型,如string,這些都不用操心。對(duì)于自定義的類型做key,就需要自己重載operator< 或者h(yuǎn)ash_value()了。


            最后,說(shuō),當(dāng)不需要結(jié)果排好序時(shí),最好用unordered_map。


            其實(shí),stl::map對(duì)于與java中的TreeMap,而boost::unordered_map對(duì)應(yīng)于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。因?yàn)閙ap內(nèi)部實(shí)現(xiàn)時(shí)調(diào)用operator<的函數(shù)好像是const。

            由于operator<比較的只是age,所以因?yàn)門om2和Tom3的age相同,所以最終結(jié)果里面只有Tom3,沒(méi)有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==是因?yàn)椋绻麅蓚€(gè)元素的hash_value的值相同,并不能斷定這兩個(gè)元素就相同,必須再調(diào)用operator==。 當(dāng)然,如果hash_value的值不同,就不需要調(diào)用operator==了。


            午夜不卡888久久| 久久亚洲AV成人出白浆无码国产 | 精品永久久福利一区二区| 精品国产综合区久久久久久 | 综合久久给合久久狠狠狠97色| 久久噜噜电影你懂的| 久久久久久久久久久久中文字幕 | 久久久无码精品午夜| 久久久久国产亚洲AV麻豆| 久久亚洲国产精品五月天婷| 久久精品亚洲福利| 亚洲国产综合久久天堂| 无码任你躁久久久久久老妇| 欧美国产成人久久精品| 亚洲精品国精品久久99热一| 久久这里只有精品18| 国产午夜久久影院| 久久精品无码专区免费| 国产A三级久久精品| 久久ww精品w免费人成| 91久久精品电影| 国产精品乱码久久久久久软件| 亚洲精品国精品久久99热一| 四虎国产精品免费久久5151| 久久精品国产99久久丝袜 | 久久久久久国产精品无码下载| 伊人久久综合无码成人网| A狠狠久久蜜臀婷色中文网| 国产精品一区二区久久精品无码| 亚洲日韩欧美一区久久久久我 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久精品国产亚洲av高清漫画| 色综合久久88色综合天天| 麻豆久久久9性大片| 国产亚洲婷婷香蕉久久精品| 亚洲色欲久久久久综合网 | 久久精品九九亚洲精品天堂| 色婷婷噜噜久久国产精品12p| 久久99亚洲网美利坚合众国| 色综合合久久天天给综看| 久久精品国产一区|