国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++11 新特性: unordered_map 與 map 的對比

2019-11-11 05:03:02
字體:
來源:轉載
供稿:網友

unordered_map和map類似,都是存儲的key-value的值,可以通過key快速索引到value。不同的是unordered_map不會根據key的大小進行排序,

存儲時是根據key的hash值判斷元素是否相同,即unordered_map內部元素是無序的,而map中的元素是按照二叉搜索樹存儲,進行中序遍歷會得到有序遍歷。

所以使用時map的key需要定義Operator<。而unordered_map需要定義hash_value函數并且重載operator==。但是很多系統內置的數據類型都自帶這些,

那么如果是自定義類型,那么就需要自己重載operator<或者hash_value()了。

結論:如果需要內部元素自動排序,使用map,不需要排序使用unordered_map

map使用案例:

復制代碼
#include<string>  #include<iostream>  #include<map>    using namespace std;    struct person  {      string name;      int age;        person(string name, int age)      {          this->name =  name;          this->age = age;      }        bool operator < (const person& p) const      {          return this->age < p.age;       }  };    map<person,int> m;  int main()  {      person p1("Tom1",20);      person p2("Tom2",22);      person p3("Tom3",22);      person p4("Tom4",23);      person p5("Tom5",24);      m.insert(make_pair(p3, 100));      m.insert(make_pair(p4, 100));      m.insert(make_pair(p5, 100));      m.insert(make_pair(p1, 100));      m.insert(make_pair(p2, 100));            for(map<person, int>::iterator iter = m.begin(); iter != m.end(); iter++)      {          cout<<iter->first.name<<"/t"<<iter->first.age<<endl;      }            return 0;  } 復制代碼

輸出為:(根據age進行了排序的結果)

Tom1    20Tom3    22Tom4    23Tom5    24因為Tom2和Tom3的age相同,由我們定義的operator<只是比較的age,所以Tom3覆蓋了Tom2,結果中沒有Tom2。

如果運算符<的重載是如下

bool operator < (const person &p)const{    return this->name < p.name;  }

輸出結果: 按照 那么進行的排序,如果有那么相同則原來的那么會被覆蓋

Tom1    20

Tom2    22

Tom3    22

Tom4    23

Tom5    24

 

unordered_map使用案例:

復制代碼
#include<string>  #include<iostream>  #include<unordered_map>  using namespace std;    struct person  {      string name;      int age;        person(string name, int age)      {          this->name =  name;          this->age = age;      }        bool operator== (const person& p) const      {          return name==p.name && age==p.age;      }  };    size_t hash_value(const person& p)  {      size_t seed = 0;      std::hash_combine(seed, std::hash_value(p.name));      std::hash_combine(seed, std::hash_value(p.age));      return seed;  }    int main()  {      typedef std::unordered_map<person,int> umap;      umap m;      person p1("Tom1",20);      person p2("Tom2",22);      person p3("Tom3",22);      person p4("Tom4",23);      person p5("Tom5",24);      m.insert(umap::value_type(p3, 100));      m.insert(umap::value_type(p4, 100));      m.insert(umap::value_type(p5, 100));      m.insert(umap::value_type(p1, 100));      m.insert(umap::value_type(p2, 100));            for(umap::iterator iter = m.begin(); iter != m.end(); iter++)      {          cout<<iter->first.name<<"/t"<<iter->first.age<<endl;      }            return 0;  }  復制代碼

對于hash_value的重載沒有成功,在vs2013上報錯。

To be stronger
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 民乐县| 弥渡县| 普安县| 萨迦县| 屯留县| 黔江区| 水富县| 资兴市| 太原市| 昭觉县| 泰宁县| 中卫市| 南漳县| 香河县| 五莲县| 德化县| 迭部县| 涟水县| 布尔津县| 新竹县| 措美县| 中阳县| 郧西县| 江山市| 珠海市| 黎平县| 鹿泉市| 湘潭县| 遂溪县| 饶河县| 十堰市| 屏东县| 杭州市| 孟津县| 华容县| 昌图县| 靖远县| 错那县| 张掖市| 迁西县| 山东省|