国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表

圖片精選

主站蜘蛛池模板: 东莞市| 桐乡市| 射洪县| 阿拉尔市| 登封市| 广饶县| 临清市| 阳高县| 宝坻区| 芮城县| 吴旗县| 双流县| 南陵县| 土默特右旗| 嘉义县| 嘉禾县| 武夷山市| 安新县| 平安县| 施甸县| 闽清县| 青川县| 陆良县| 阿图什市| 黑山县| 肥西县| 乐业县| 沅江市| 陇川县| 宁蒗| 扎兰屯市| 天镇县| 九龙城区| 聂荣县| 大丰市| 印江| 澎湖县| 洪洞县| 寿阳县| 南安市| 桐乡市|