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

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

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

2019-11-11 07:03:27
字體:
供稿:網(wǎng)友

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

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

所以使用時(shí)map的key需要定義Operator<。而unordered_map需要定義hash_value函數(shù)并且重載operator==。但是很多系統(tǒng)內(nèi)置的數(shù)據(jù)類型都自帶這些,

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

結(jié)論:如果需要內(nèi)部元素自動(dòng)排序,使用map,不需要排序使用unordered_map

map使用案例:

復(fù)制代碼
#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;  } 復(fù)制代碼

輸出為:(根據(jù)age進(jìn)行了排序的結(jié)果)

Tom1    20Tom3    22Tom4    23Tom5    24因?yàn)門om2和Tom3的age相同,由我們定義的operator<只是比較的age,所以Tom3覆蓋了Tom2,結(jié)果中沒有Tom2。

如果運(yùn)算符<的重載是如下

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

輸出結(jié)果: 按照 那么進(jìn)行的排序,如果有那么相同則原來的那么會被覆蓋

Tom1    20

Tom2    22

Tom3    22

Tom4    23

Tom5    24

 

unordered_map使用案例:

復(fù)制代碼
#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;  }  復(fù)制代碼

對于hash_value的重載沒有成功,在vs2013上報(bào)錯(cuò)。

To be stronger
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 宝兴县| 鄢陵县| 扶风县| 本溪市| 瑞丽市| 沾化县| 安义县| 吉首市| 双城市| 定陶县| 屏东县| 蓬莱市| 淅川县| 枞阳县| 丹寨县| 甘德县| 津南区| 永修县| 阿勒泰市| 芒康县| 永和县| 靖远县| 宁阳县| 古丈县| 察雅县| 子长县| 铜川市| 宁都县| 安徽省| 丹棱县| 巴林左旗| 儋州市| 兖州市| 巴林右旗| 兴城市| 梨树县| 安泽县| 兖州市| 安塞县| 昌平区| 灵丘县|