C++ STL学习笔记 : 2. unordered map 容器
本文中,簡單總結(jié)一下使用unordered map 的心得。unordered_map容器屬于STL中關(guān)聯(lián)表的一種,常用的map容器與unordered_map容器在使用中有著很大程度的相同點(diǎn),在之后的文章中我可能會針對二者的相同點(diǎn)與不同點(diǎn)進(jìn)行細(xì)致的分析,這里就不過多贅述,只是簡單地和大家一起了解一下unordered_map的一些基本使用。
關(guān)聯(lián)表作為STL庫中的一類常見的容器,其結(jié)構(gòu)和數(shù)組類似。與數(shù)組不同的是,關(guān)聯(lián)表中有兩個(gè)類型,鍵key索引類和被索引的元素類。Key值和元素的關(guān)系我們可以理解為映射關(guān)系。一個(gè)鍵值有且僅有一個(gè)對應(yīng)的元素。
同時(shí),關(guān)聯(lián)表中使用的索引類,不再是簡單的自然數(shù),而是可以根據(jù)需要選擇使用string字符串類,或自定義的類作為索引key的類型。不再使用自然數(shù)作為索引讓關(guān)聯(lián)表的使用相較于數(shù)組更加靈活,但需要注意的是,一個(gè)關(guān)聯(lián)表中的所有鍵都應(yīng)該是同一類型,所有被索引的元素也應(yīng)該是同一類型。這兩個(gè)類型在定義關(guān)聯(lián)表的同時(shí)進(jìn)行定義。下面我們就回到關(guān)聯(lián)表中的一種容器,本篇文章的主角 : unordered_map的使用。
0.include相關(guān)庫。
# include <unordered_map>1.定義一個(gè)一維的unordered map:
第一部分,如何定義一個(gè)空的unordered_map容器。
unordered_map<uint64_t,string> mymap; unordered_map<uint64_t,uint64_t> mymap2a unordered_map<string,string>mymap3;<>中的第一個(gè)參數(shù)是key的類型,第二個(gè)參數(shù)是對應(yīng)的元素集的數(shù)據(jù)類型。unordered_map類可以理解為一個(gè)使用key作為角標(biāo)標(biāo)注的列表,只不過這個(gè)列表是無序的,且列表的序號也不再要求一定是正整數(shù)。與數(shù)組比較,unordered map等容器更加自由,更易于查找。
2.向unordered_map里添加項(xiàng):
這個(gè)部分我們介紹一些向unordered_map里添加項(xiàng)的方法。
// 1. 使用insert方法 mymap.insert(make_pair(10,"nihao")); mymap.insert(pair<uint64_t,string>(20,"hello")); uint64_t ind = 30; string toto = "hello"; mymap.insert(pair<uint64_t,string>(ind,toto)); //2. 使用角標(biāo)直接賦值 mymap[40] = "nihaoma";需要注意的是,一個(gè)key只能對應(yīng)一個(gè)存儲的數(shù)據(jù)。如果key已經(jīng)存在了,使用insert方法對已存在的key進(jìn)行插入操作不會覆蓋之前key對應(yīng)的值,而使用中括號,類似數(shù)組的賦值方法,例如mymap[10]="hahaha"可以覆蓋已存在的key所對應(yīng)的值。當(dāng)然,如果使用中括號賦值時(shí)中括號中的key值在容器中不存在,那么此時(shí)中括號賦值的效果和使用insert方法一致,會為容器添加一個(gè)新的key 鍵,并插入對應(yīng)的值。這一點(diǎn)在接下來我們使用二維unordered_map時(shí)還會進(jìn)一步說明。
3.迭代器 iterator
由于unordered_map其中的項(xiàng)是沒有順序排列的,且鍵值可以不為正整數(shù),因此為了對unordered_map中的每一項(xiàng)進(jìn)行操作,且和數(shù)組一樣滿足我們遍歷的需要,就必須使用迭代器。
迭代器的定義方法很簡單,C<>::iterator name_iterator;
延續(xù)上述例子, 迭代器的定義方法代碼如下:
迭代器可以使用容器的begin()或end()方法進(jìn)行初始化 :
unordered_map<uint64_t,string>::iterator ite_mymap(mymap.begin());迭代器可以理解為指向容器某一項(xiàng)的指針,每一項(xiàng)都包含一個(gè)key值和一個(gè)元素值,和指針一樣,用*ite_mymap可以對迭代器取值。下述代碼是一個(gè)簡單的使用迭代器讀取key值和元素值的例子:
#include <iostream> #include <unordered_map> using namespace std; int main() {unordered_map < uint64_t, uint64_t > mymap;mymap.insert(make_pair(10, 20));unordered_map < uint64_t, uint64_t >::iterator ite_mymap(mymap.begin());cout << (*ite_mymap).first<<endl;cout << (*ite_mymap).second << endl;cout << ite_mymap->first << endl;cout << ite_mymap->second << endl;return 0; }執(zhí)行結(jié)果如下 :
通過上述代碼以及執(zhí)行結(jié)果我們不難看出,容器中的每一項(xiàng),都包含有first和second兩個(gè)屬性,分別對應(yīng)了key 鍵值和元素值。我們既可以通過指向項(xiàng)的迭代器指針讀取這兩個(gè)屬性,同時(shí)也可以使用取值符號,直接通過項(xiàng)來讀取這兩個(gè)屬性。
4. 使用迭代器遍歷
有了在上述步驟中的認(rèn)識,使用迭代器遍歷容器也變得非常簡單,使用一個(gè)for循環(huán)就可以遍歷容器并利用迭代器進(jìn)行操作了 :
for(ite_mymap=mymap.begin();ite_mymap!=mymap.end();ite_mymap++) {... }5.二維unordered_map的使用
通過上面的幾個(gè)部分,我們已經(jīng)大致了解了一維unordered_map的使用。正如一開始我們提到的,unordered_map中被索引的元素類型可以是任意類,二維unordered_map實(shí)際就是被索引的元素集是令一個(gè)unordered_map類,這樣就構(gòu)成了二維的unordered_map。下面是一個(gè)簡單的例子:
unordered_map<uint64_t, unordered_map<uint64_t, uint64_t>> mymap; unordered_map<uint64_t, uint64_t> tmp; tmp.insert(make_pair(10, 25)); mymap.insert(pair < uint64_t, unordered_map<uint64_t, uint64_t>>(10, tmp)); mymap[10][20] = 30; mymap[10][40] = 35; mymap[20][40] = 50; unordered_map<uint64_t, unordered_map<uint64_t, uint64_t>>::iterator multitr; unordered_map<uint64_t, uint64_t>::iterator intertr; for(multitr=mymap.begin();multitr!=mymap.end();multitr++){for(intertr= multitr ->second.begin(); intertr != multitr ->second.end(); intertr ++)std::cout<< multitr ->first<<" "<<intertr->first<<" ("<< intertr -> second <<")"<<endl;}輸出結(jié)果如下 :
上述例子中,我們定義了unordered_map mymap,其鍵key類型為uint64_t,對應(yīng)的元素類型為另一個(gè)unordered_map類。對于mymap來說,一個(gè)鍵對應(yīng)一個(gè)unordered_map類的元素。對于二維unordered_map的遍歷,我們定義兩個(gè)迭代器,一個(gè)外部迭代器,一個(gè)內(nèi)部迭代器。類似二維數(shù)組的遍歷,我們使用for循環(huán)的嵌套來遍歷二維的unordered_map。
總結(jié)
以上是生活随笔為你收集整理的C++ STL学习笔记 : 2. unordered map 容器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ STL学习笔记 : 1. tem
- 下一篇: Dijkstra迪杰斯特拉算法 C++实