Cosa significa iteratore-> secondo?


157

In C ++, qual è il tipo di a std::map<>::iterator?

Sappiamo che un oggetto itdi tipo std::map<A,B>::iteratorha un sovraccarico operator ->che restituisce a std::pair<A,B>*e che std::pair<>ha a firste secondmembro.

Ma a cosa corrispondono questi due membri e perché dobbiamo accedere al valore memorizzato nella mappa it->second?


14
A std::mapmemorizza una chiave e un valore . map::iterator.secondsi riferisce al valore .
Risparmia il

Risposte:


247

Sono sicuro che sai che un std::vector<X>negozio contiene un sacco di Xoggetti, giusto? Ma se hai un std::map<X, Y>, ciò che effettivamente memorizza è un sacco di std::pair<const X, Y>s. Questo è esattamente ciò che è una mappa: accoppia le chiavi e i valori associati.

Quando iteri su a std::map, stai iterando su tutti questi messaggi std::pair. Quando si dereferenzia uno di questi iteratori, si ottiene un std::paircontenente la chiave e il valore associato.

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

Qui, se lo fai ora *it, otterrai std::pairil primo elemento nella mappa.

Ora il tipo std::pairti dà accesso ai suoi elementi attraverso due membri: firste second. Quindi se hai std::pair<X, Y>chiamato p, p.firstè un Xoggetto ed p.secondè un Yoggetto.

Quindi ora sai che dereferenziare un std::mapiteratore ti dà un std::pair, puoi quindi accedere ai suoi elementi con firste second. Ad esempio, (*it).firstti darà la chiave e (*it).secondti darà il valore. Questi sono equivalenti a it->firste it->second.


4
Perché non usano semplicemente [0] e [1] (per "primo" e "secondo") come tutto il resto nella programmazione?

21
@AdamCross Perché operator[]deve restituire un tipo specifico ma firste secondpuò avere tipi diversi. D'altra parte, std::tupleha una speciale funzione di aiuto std::getper accedere ai suoi elementi per indice.
Joseph Mansfield,

16

Il tipo di elementi di un std::map(che è anche il tipo di un'espressione ottenuta dereferenziando un iteratore di quella mappa) la cui chiave è Ke il cui valore Vè std::pair<const K, V>- la chiave è constimpedire all'utente di interferire con l'ordinamento interno dei valori della mappa.

std::pair<>ha due membri nominati firste second(vedi qui ), con un significato abbastanza intuitivo. Pertanto, dato un iteratore ia una determinata mappa, l'espressione:

i->first

Che equivale a:

(*i).first

Si riferisce al primo ( const) elemento pairdell'oggetto a cui punta l'iteratore, ovvero si riferisce a una chiave nella mappa. Invece, l'espressione:

i->second

Che equivale a:

(*i).second

Si riferisce al secondo elemento di pair- ovvero al valore corrispondente nella mappa.


5
Le parole "chiave" e "valore" sarebbero state più intuitive di "primo" e "secondo", che implicano l'ordinamento.
ahoffer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.