在C++中,std::map<>::iterator
的類型是什麼?iterator-> second是什麼意思?
我們知道,std::map<A,B>::iterator
類型的對象it
具有一個重載operator ->
它返回一個std::pair<A,B>*
,並且該std::pair<>
具有first
和second
構件。
但是,這兩個成員對應的是什麼,爲什麼我們必須訪問存儲在地圖中的值爲it->second
?
在C++中,std::map<>::iterator
的類型是什麼?iterator-> second是什麼意思?
我們知道,std::map<A,B>::iterator
類型的對象it
具有一個重載operator ->
它返回一個std::pair<A,B>*
,並且該std::pair<>
具有first
和second
構件。
但是,這兩個成員對應的是什麼,爲什麼我們必須訪問存儲在地圖中的值爲it->second
?
我確定你知道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
類型可讓您通過兩個成員訪問其元素:first
和second
。所以如果你有一個叫做p
的std::pair<X, Y>
,p.first
是一個X
對象而p.second
是一個Y
對象。
所以,現在你知道解引用std::map
迭代器給你一個std::pair
,你就可以訪問它與first
和second
元素。例如,(*it).first
會給你的關鍵和(*it).second
會給你的價值。這些相當於it->first
和it->second
。
爲什麼他們不像編程中的其他東西一樣使用[0]和[1](用於「第一」和「第二」)? – 2015-04-28 23:20:20
@AdamCross因爲'operator []'必須返回一個特定類型,但'first'和'second'可以有不同的類型。另一方面,'std :: tuple'有一個特殊的幫助函數'std :: get'來通過索引來訪問它的元素。 – 2015-04-28 23:29:32
謝謝你的回答。這是有道理的。 – 2015-04-29 02:12:53
類型的std::map
的元件(其也是通過解引用該地圖的一個迭代獲得的表達式的類型),其關鍵是K
和值是V
是std::pair<const K, V>
- 關鍵是const
防止您干擾與地圖值的內部排序。
std::pair<>
有一個名爲first
和second
兩個成員(見here),有很直觀的意義。因此,給定的迭代器i
到一定地圖,表達式:
i->first
即相當於:
(*i).first
指第一(const
)的pair
對象的元件所指向的迭代器 - 即它指的是地圖中的鍵。取而代之的是,表達:
i->second
即相當於:
(*i).second
指pair
的秒元件 - 即在圖中的對應值。
一個'std :: map'存儲一個*鍵*和一個*值* .'map :: iterator.second'指向*值*。 – 2013-03-16 15:56:02
@AlokSave:謝謝。你的評論節省了很多讀者閱讀兩個答案,顯然,這個答案可能縮小到推文的長度。 – displayName 2018-02-23 18:49:38