184 votes

Ce n'itérateur->le deuxième moyen?

En C++, ce qui est le type d'un std::map<>::iterator?

Nous savons qu'un objet it de type std::map<A,B>::iterator a surchargé operator -> qui retourne un std::pair<A,B>*, et que l' std::pair<> a first et second membre.

Mais, ce que font ces deux membres correspondent, et pourquoi avons-nous d'accéder à la valeur stockée dans la carte comme it->second?

301voto

Joseph Mansfield Points 59346

Je suis sûr que vous le savez, std::vector<X> magasins tout un tas d' X objets, droit? Mais si vous avez un std::map<X, Y>, ce qu'il stocke en fait est tout un tas d' std::pair<const X, Y>s. C'est exactement ce qu'une carte est - il des paires ensemble les clés et les valeurs associées.

Lorsque vous parcourez un std::map, vous êtes une itération sur l'ensemble de ces std::pairs. Lorsque vous déréférencer un de ces itérateurs, vous obtenez un std::pair contenant la clé et sa valeur associée.

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

Ici, maintenant, si vous n' *it, vous obtiendrez la de la std::pair pour le premier élément de la carte.

Or, le type std::pair vous donne accès à ses éléments par le biais de deux membres: first et second. Donc, si vous avez un std::pair<X, Y> appelés p, p.first est X objet et p.second est Y objet.

Alors maintenant, vous savez que la référence à un std::map itérateur vous donne un std::pair, vous pouvez ensuite accéder à ses éléments avec des first et second. Par exemple, (*it).first va vous donner la clé, et (*it).second vous donnera la valeur. Ce sont les équivalents it->first et it->second.

23voto

Andy Prowl Points 62121

Le type des éléments d'un std::map (qui est aussi le type d'une expression obtenue par référence à un itérateur de cette carte) dont la clé est d' K et la valeur est V est std::pair<const K, V> - la clé est - const pour vous éviter d'interférer avec le tri interne des valeurs de la carte.

std::pair<> est composé de deux membres nommés first et second (voir ici), avec une interface intuitive de sens. Ainsi, étant donné un itérateur i à une certaine carte, l'expression:

`i->first`

Ce qui est équivalent à:

`(*i).first`

Se réfère à la première (const) élément de l' pair objet pointé par l'itérateur - dire qu'il fait référence à une clé dans la carte. Au lieu de cela, l'expression:

`i->second`

Ce qui est équivalent à:

`(*i).second`

Désigne le deuxième élément de l' pair - c'est à dire à la correspondante de la valeur de la carte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X