En C ++, ¿cuál es el tipo de a std::map<>::iterator
?
Sabemos que un objeto it
de tipo std::map<A,B>::iterator
tiene una sobrecarga operator ->
que devuelve un std::pair<A,B>*
, y que std::pair<>
tiene un miembro first
y second
.
Pero, ¿a qué corresponden estos dos miembros y por qué tenemos que acceder al valor almacenado en el mapa como it->second
?
std::map
almacena una clave y un valor .map::iterator.second
se refiere a la valor .Respuestas:
Estoy seguro de que sabes que un
std::vector<X>
almacena un montón deX
objetos, ¿verdad? Pero si tienes unstd::map<X, Y>
, lo que realmente almacena es un montón destd::pair<const X, Y>
s. Eso es exactamente lo que es un mapa: combina las claves y los valores asociados.Cuando iteras sobre un
std::map
, estás iterando sobre todos estosstd::pair
s. Cuando desreferencia uno de estos iteradores, obtiene un questd::pair
contiene la clave y su valor asociado.Aquí, si ahora lo haces
*it
, obtendrásstd::pair
el primer elemento del mapa.Ahora el tipo
std::pair
le da acceso a sus elementos a través de dos miembros:first
ysecond
. Entonces, si tiene unastd::pair<X, Y>
llamadap
,p.first
es unX
objeto yp.second
es unY
objeto.Entonces, ahora que sabe que desreferenciar un
std::map
iterador le da unstd::pair
, puede acceder a sus elementos confirst
ysecond
. Por ejemplo,(*it).first
le dará la clave y(*it).second
le dará el valor. Estos son equivalentes ait->first
yit->second
.fuente
operator[]
tiene que devolver un tipo específico, sinofirst
, ysecond
puede tener diferentes tipos. Por otro lado,std::tuple
tiene una función auxiliar especialstd::get
para acceder a sus elementos por índice.El tipo de elementos de una
std::map
(que también es el tipo de una expresión obtenida al desreferenciar un iterador de ese mapa) cuya clave esK
y valorV
esstd::pair<const K, V>
- la clave esconst
para evitar que interfiera con la clasificación interna de los valores del mapa.std::pair<>
tiene dos miembros nombradosfirst
ysecond
(ver aquí ), con un significado bastante intuitivo. Por lo tanto, dado un iteradori
a cierto mapa, la expresión:Lo que es equivalente a:
Se refiere al primer
const
elemento ( ) depair
objeto señalado por el iterador, es decir, se refiere a una clave en el mapa. En cambio, la expresión:Lo que es equivalente a:
Se refiere al segundo elemento de
pair
- es decir, al valor correspondiente en el mapa.fuente