欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

STL map與Boost unordered_map - orzlzro的專欄

系統 2144 0

STL map與Boost unordered_map - orzlzro的專欄 - 博客頻道 - CSDN.NET

?


STL map與Boost unordered_map


分類:
C++


1182人閱讀
評論 (0)
收藏
舉報

?

今天看到? 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. ??
  5. using ? namespace ?std;??
  6. ??
  7. struct ?person??
  8. {??
  9. ????string?name;??
  10. ???? int ?age;??
  11. ??
  12. ????person(string?name,? int ?age)??
  13. ????{??
  14. ???????? this ->name?=??name;??
  15. ???????? this ->age?=?age;??
  16. ????}??
  17. ??
  18. ???? bool ?operator?<?( const ?person&?p)? const ??
  19. ????{??
  20. ???????? return ? this ->age?<?p.age;??
  21. ????}??
  22. };??
  23. ??
  24. map<person, int >?m;??
  25. int ?main()??
  26. {??
  27. ????person?p1( "Tom1" ,20);??
  28. ????person?p2( "Tom2" ,22);??
  29. ????person?p3( "Tom3" ,22);??
  30. ????person?p4( "Tom4" ,23);??
  31. ????person?p5( "Tom5" ,24);??
  32. ????m.insert(make_pair(p3,?100));??
  33. ????m.insert(make_pair(p4,?100));??
  34. ????m.insert(make_pair(p5,?100));??
  35. ????m.insert(make_pair(p1,?100));??
  36. ????m.insert(make_pair(p2,?100));??
  37. ??????
  38. ???? for (map<person,? int >::iterator?iter?=?m.begin();?iter?!=?m.end();?iter++)??
  39. ????{??
  40. ????????cout<<iter->first.name<< "\t" <<iter->first.age<<endl;??
  41. ????}??
  42. ??????
  43. ???? return ?0;??
  44. }??

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



輸出

Tom1 ? ?20

Tom5 ? ?24

Tom4 ? ?23

Tom2 ? ?22

Tom3 ? ?22



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



STL map與Boost unordered_map - orzlzro的專欄 - 博客頻道 - CSDN.NET


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久九色 | 欧美在线看 | 日韩精品 电影一区 亚洲 | 亚洲免费精品视频 | 亚洲欧洲精品成人久久曰影片 | 亚洲一区欧美日韩 | 青草综合| 午夜私人影院粉色视频我要 | 99久久精品日本一区二区免费 | 欧美人与禽性xxxxx杂性 | 成人国产精品2021 | 97久久精品午夜一区二区 | www.久久| 男人天堂网www | 五月在线观看 | 国产精品爱久久久久久久电影 | 欧美14一18处毛片 | 日韩精品免费视频 | 色网站免费视频 | 国产精品久久久久久免费 | 天天干天天操天天做 | 国产精品高潮呻吟久久av黑人 | 小明免费视频一区二区 | 好吊色欧美一区二区三区四区 | 国产精品久久久久9999高清 | 婷婷人人爽人人做人人添 | 天堂中文资源在线观看 | 久久国产欧美日韩精品 | 污免费网站 | 久久免费视频在线 | 狠狠久| 免费观看成人拍拍拍1000视频 | 超碰免费在线 | 日韩一区精品 | 国产精品视频第一页 | 国产精品揄拍100视频最近 | 91青青国产在线观看免费 | 精品国产黄a∨片高清在线 亚洲3atv精品一区二区三区 | 日韩在线视频免费 | 中文字幕综合在线观看 | 国产成人lu在线视频 |