Uso const_iterator
come:
map<string,Shopable*>::const_iterator it = mymap.begin();
Da l'errore, il suo chiaro che mymap.begin()
rendimenti const_iterator
. Questo perché mymap
è const
nella funzione in cui hai scritto questo, qualcosa come segue:
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()
}
Cioè, const
contenitore (se la sua std::map
, std::vector
ecc) restituisce const_iterator
e contenitore non-const rendimenti iterator
.
Ogni contenitore ha funzioni sovraccariche di begin()
e end()
. Quindi il contenitore const
richiama l'overloading begin()
che restituisce const_iterator
e il contenitore non const invoca l'altro sovraccarico begin()
che restituisce iterator
. E lo stesso vale per le funzioni sovraccaricate di end()
.
Perché restituire un 'const_iterator '? Tutti gli esempi che ho visto ritornano semplicemente "iteratore". – pighead10
std :: map.begin() ha anche un overload che restituisce un 'iteratore'. Vedere http://www.cplusplus.com/reference/stl/map/begin/ –
@Pig Head: ho fornito una risposta, ma fondamentalmente ci sono due overload, uno dei quali è una funzione const member, l'altro è un funzione membro non const. Quindi si chiama 'begin()' su un oggetto non-const, si prenderà la versione non-const e si restituirà un 'iterator', quando si chiama' begin() 'su una mappa const verrà acquisita la versione const e restituire un 'const_iterator'. –