¿Qué significa iterador-> segundo?

157

En C ++, ¿cuál es el tipo de a std::map<>::iterator?

Sabemos que un objeto itde tipo std::map<A,B>::iteratortiene una sobrecarga operator ->que devuelve un std::pair<A,B>*, y que std::pair<>tiene un miembro firsty second.

Pero, ¿a qué corresponden estos dos miembros y por qué tenemos que acceder al valor almacenado en el mapa como it->second?

Noich
fuente
14
A std::mapalmacena una clave y un valor . map::iterator.secondse refiere a la valor .
Alok Save

Respuestas:

247

Estoy seguro de que sabes que un std::vector<X>almacena un montón de Xobjetos, ¿verdad? Pero si tienes un std::map<X, Y>, lo que realmente almacena es un montón de std::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 estos std::pairs. Cuando desreferencia uno de estos iteradores, obtiene un que std::paircontiene la clave y su valor asociado.

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

Aquí, si ahora lo haces *it, obtendrás std::pairel primer elemento del mapa.

Ahora el tipo std::pairle da acceso a sus elementos a través de dos miembros: firsty second. Entonces, si tiene una std::pair<X, Y>llamada p, p.firstes un Xobjeto y p.secondes un Yobjeto.

Entonces, ahora que sabe que desreferenciar un std::mapiterador le da un std::pair, puede acceder a sus elementos con firsty second. Por ejemplo, (*it).firstle dará la clave y (*it).secondle dará el valor. Estos son equivalentes a it->firsty it->second.

Joseph Mansfield
fuente
44
¿Por qué no usan simplemente [0] y [1] (para "primero" y "segundo") como todo lo demás en programación?
21
@AdamCross Debido a que operator[]tiene que devolver un tipo específico, sino first, y secondpuede tener diferentes tipos. Por otro lado, std::tupletiene una función auxiliar especial std::getpara acceder a sus elementos por índice.
Joseph Mansfield
16

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 es Ky valor Ves std::pair<const K, V>- la clave es constpara evitar que interfiera con la clasificación interna de los valores del mapa.

std::pair<>tiene dos miembros nombrados firsty second(ver aquí ), con un significado bastante intuitivo. Por lo tanto, dado un iterador ia cierto mapa, la expresión:

i->first

Lo que es equivalente a:

(*i).first

Se refiere al primerconst elemento ( ) depair objeto señalado por el iterador, es decir, se refiere a una clave en el mapa. En cambio, la expresión:

i->second

Lo que es equivalente a:

(*i).second

Se refiere al segundo elemento de pair- es decir, al valor correspondiente en el mapa.

Andy Prowl
fuente
55
Las palabras "clave" y "valor" habrían sido más intuitivas que "primero" y "segundo", lo que implica ordenar.
ahoffer