2013-03-16 32 views
104

在C++中,std::map<>::iterator的類型是什麼?iterator-> second是什麼意思?

我們知道,std::map<A,B>::iterator類型的對象it具有一個重載operator ->它返回一個std::pair<A,B>*,並且該std::pair<>具有firstsecond構件。

但是,這兩個成員對應的是什麼,爲什麼我們必須訪問存儲在地圖中的值爲it->second

+10

一個'std :: map'存儲一個*鍵*和一個*值* .'map :: iterator.second'指向*值*。 – 2013-03-16 15:56:02

+0

@AlokSave:謝謝。你的評論節省了很多讀者閱讀兩個答案,顯然,這個答案可能縮小到推文的長度。 – displayName 2018-02-23 18:49:38

回答

163

我確定你知道std::vector<X>存儲了大量的X對象,對不對?但是如果你有一個std::map<X, Y>,它實際存儲的是一大堆std::pair<const X, Y> s。這正是一張地圖 - 它將鍵和相關值組合在一起。

當您遍歷std::map時,您正在迭代所有這些std::pair s。當您取消引用其中一個迭代器時,會得到一個包含密鑰及其關聯值的std::pair

std::map<std::string, int> m = /* fill it */; 
auto it = m.begin(); 

在這裏,如果你現在要做*it,你將得到的std::pair在地圖的第一個元素。

現在,std::pair類型可讓您通過兩個成員訪問其元素:firstsecond。所以如果你有一個叫做pstd::pair<X, Y>p.first是一個X對象而p.second是一個Y對象。

所以,現在你知道解引用std::map迭代器給你一個std::pair,你就可以訪問它與firstsecond元素。例如,(*it).first會給你的關鍵和(*it).second會給你的價值。這些相當於it->firstit->second

+2

爲什麼他們不像編程中的其他東西一樣使用[0]和[1](用於「第一」和「第二」)? – 2015-04-28 23:20:20

+13

@AdamCross因爲'operator []'必須返回一個特定類型,但'first'和'second'可以有不同的類型。另一方面,'std :: tuple'有一個特殊的幫助函數'std :: get'來通過索引來訪問它的元素。 – 2015-04-28 23:29:32

+1

謝謝你的回答。這是有道理的。 – 2015-04-29 02:12:53

13

類型的std::map的元件(其也是通過解引用該地圖的一個迭代獲得的表達式的類型),其關鍵是K和值是Vstd::pair<const K, V> - 關鍵是const防止您干擾與地圖值的內部排序。

std::pair<>有一個名爲firstsecond兩個成員(見here),有很直觀的意義。因此,給定的迭代器i到一定地圖,表達式:

i->first 

即相當於:

(*i).first 

第一const)的pair對象的元件所指向的迭代器 - 即它指的是地圖中的。取而代之的是,表達:

i->second 

即相當於:

(*i).second 

pair元件 - 即在圖中的對應