Uso const_iterator
como:
map<string,Shopable*>::const_iterator it = mymap.begin();
Desde el error, claro que sus retornos mymap.begin()
const_iterator
. Esto es así porque es mymap
const
en la función donde se ha escrito esto, algo así como lo siguiente:
void f(const std::map<int,int> & m)
{ //^^^^^ note this
std::map<int,int>::const_iterator it = m.begin(); //m is const in f()
//^^^^^ note this
}
void g(std::map<int,int> & m)
{
std::map<int,int>::iterator it = m.begin(); //m is non-const in g()
}
que es, const
contenedor (si su std::map
, std::vector
etc) devuelve const_iterator
y contenedores no constante vuelve iterator
.
Cada contenedor tiene funciones sobrecargadas de begin()
y end()
. Entonces, el contenedor const
invoca el begin()
sobrecargado que devuelve const_iterator
y el contenedor no constante invoca el otro sobrecargado begin()
que devuelve iterator
. Y lo mismo para las funciones sobrecargadas end()
.
¿Por qué devolvería un 'const_iterator ¿? Todos los ejemplos que he visto devuelven 'iterator'. – pighead10
std :: map.begin() también tiene una sobrecarga que devuelve un 'iterador'. Ver http://www.cplusplus.com/reference/stl/map/begin/ –
@Pig Head: He proporcionado una respuesta, pero básicamente hay dos sobrecargas, una de las cuales es una función de miembro constante, la otra es una función de miembro no const. Entonces llamas 'begin()' en un objeto no const, recogerá la versión non-const y devolverá un 'iterator', cuando invoques' begin() 'en un mapa const recogerá la versión const y devuelve un 'const_iterator'. –