PDA

Visualizza la versione completa : [c++ stl]erase


giuseppe500
14-08-2010, 19:40
ciao.
sto tentando di cancellare l'ultimo elemento di una mappa stl:
std::map<std::string,CBone*> m_MapBones;
ho provato con:
m_MapBones.erase(m_MapBones.end());
ma non ci sono riuscito , la mappa non è nulla e l'errore è


map/set erase iterator outside range


, al che ho provato con:
m_MapBones.erase(m_MapBones.end()-1);

e il compilatore mi da questi errori:
Error 13 error C2676: binary '-' : 'std::_Tree<_Traits>::iterator' does not define this operator or a conversion to a type acceptable to the predefined operator c:\programmazione\old2\old\wild magic 4\geometrictools\wildmagic4\samplegraphics\materia ltextures\skeleton.cpp 125

e questo:
Error 1 error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::_Tree<_Traits>::iterator' c:\programmazione\old2\old\wild magic 4\geometrictools\wildmagic4\samplegraphics\materia ltextures\skeleton.cpp 125

come si fa?
grazie.

shodan
14-08-2010, 19:46
Prova con:
m_MapBones.erase(m_MapBones.rbegin());

Per la cronaca, un iterator end() non da l'ultimo elemento, ma una locazione successiva all'ultimo elemento utile solo come stopper.

giuseppe500
14-08-2010, 20:34
e perchè mi da errore con end()-1?
com è che posso usare i valori?

shodan
14-08-2010, 21:10
La map usa i bidirectional_iterator che non possono essere spostati a piacimento come i random_iterator.
Possono essere spostati avanti o indietro solo con ++ o --

Per ottenere un iteratore a piacimento, si usa std::advance();


m_MapBones.erase(
std::advance(m_MapBones.begin(), m_MapBones.size()-1)
);

Loading