PDA

Visualizza la versione completa : [c++stl]semplice ciclo


giuseppe500
14-05-2010, 17:15
ciao.



for( IteratorAll = m_pMapAll->begin();IteratorAll != m_pMapAll->end(); IteratorAll++)
if(m_pMapCurrent->find(IteratorAll->first) == m_pMapCurrent->end()){
m_pVectorDel->push_back(IteratorAll->second);
(*m_pMapAll).erase(IteratorAll);
}


ho il solito problema che togliendo un elemento dinamicamente usando gli iteratori non c piu coerenza nei cicli(almeno penso)

qui quando m_pMapAll = 1 lemento se lo tolgo quando riparte

for( IteratorAll = m_pMapAll->begin();IteratorAll != m_pMapAll->end(); IteratorAll++)

da un errore.
come si fa?
grazie.

shodan
14-05-2010, 18:21
Non puoi cancellare un iteratore dalla mappa e pretendere che rimanga valido.
Devi ricalcolarlo se lo cancelli.


for( IteratorAll = m_pMapAll->begin();IteratorAll != m_pMapAll->end(); ++IteratorAll)
if(m_pMapCurrent->find(IteratorAll->first) == m_pMapCurrent->end()){
m_pVectorDel->push_back(IteratorAll->second);
m_pMapAll->erase(IteratorAll);
IteratorAll = m_pMapAll->begin();
}
}

P.S.
Abituati a usare gli operatore prefissi con gli iteratori. Sono pi veloci.

giuseppe500
16-05-2010, 23:53
scusa shodan , ma non mi funziona , ho provato in mille modi , quando resetto l'iteratore al begin della mappa al reiniziare del ciclo mi da errore

shodan
17-05-2010, 12:44
Modifica cos:


map<>::iterator IteratorAll = m_pMapAll->begin();
do {
if(m_pMapCurrent->find(IteratorAll->first) == m_pMapCurrent->end()){
m_pVectorDel->push_back(IteratorAll->second);
m_pMapAll->erase(IteratorAll);
IteratorAll = m_pMapAll->begin();
} else {
++IteratorAll;
}
} while (IteratorAll != m_pMapAll->end());


Se ti da ancora errori, hai qualche altro problema nel codice.

Loading