Em C ++, qual é o tipo de a std::map<>::iterator
?
Sabemos que um objeto it
do tipo std::map<A,B>::iterator
tem uma sobrecarga operator ->
que retorna um std::pair<A,B>*
, e que o std::pair<>
tem first
e second
membro.
Mas, a que esses dois membros correspondem e por que precisamos acessar o valor armazenado no mapa como it->second
?
std::map
armazena uma chave e um valor .map::iterator.second
refere-se ao valor .Respostas:
Tenho certeza que você sabe que um
std::vector<X>
armazena um monte deX
objetos, certo? Mas se você tem umstd::map<X, Y>
, o que ele realmente armazena é um monte destd::pair<const X, Y>
s. É exatamente o que é um mapa - ele une as chaves e os valores associados.Quando você itera sobre um
std::map
, você está iterando sobre todos essesstd::pair
s. Quando você desreferencia um desses iteradores, obtém umstd::pair
contendo a chave e seu valor associado.Aqui, se você o fizer agora
*it
, receberástd::pair
o primeiro elemento no mapa.Agora, o tipo
std::pair
dá acesso a seus elementos através de dois membros:first
esecond
. Portanto, se você tiverstd::pair<X, Y>
chamadop
,p.first
é umX
objeto ep.second
é umY
objeto.Portanto, agora você sabe que a desreferenciação de um
std::map
iterador fornece astd::pair
, então você pode acessar seus elementos comfirst
esecond
. Por exemplo,(*it).first
você fornecerá a chave e(*it).second
o valor. Estes são equivalentes ait->first
eit->second
.fonte
operator[]
tem que retornar um tipo específico masfirst
esecond
podem ter tipos diferentes. Por outro lado,std::tuple
possui uma função auxiliar especialstd::get
para acessar seus elementos por índice.O tipo dos elementos de um
std::map
(que também é o tipo de uma expressão obtida desreferenciando um iterador desse mapa) cuja chave éK
e seu valor éV
isstd::pair<const K, V>
- a chave éconst
impedir que você interfira na classificação interna dos valores do mapa.std::pair<>
tem dois membros nomeadosfirst
esecond
(veja aqui ), com um significado bastante intuitivo. Assim, dado um iteradori
para um determinado mapa, a expressão:O que equivale a:
Refere-se ao primeiro
const
elemento ( ) dopair
objeto apontado pelo iterador - ou seja, refere-se a uma chave no mapa. Em vez disso, a expressão:O que equivale a:
Refere-se ao segundo elemento do
pair
- ie ao valor correspondente no mapa.fonte