2009-06-23 11 views
34

È possibile eseguire normali calcoli con iteratori, ad esempio incrementarlo aggiungendo un numero?Posso incrementare un iteratore semplicemente aggiungendo un numero?

Per fare un esempio, se voglio rimuovere l'elemento vec[3], posso solo fare questo:

std::vector<int> vec; 
for(int i = 0; i < 5; ++i){ 
     vec.push_back(i); 
} 
vec.erase(vec.begin() + 3); // removes vec[3] element 

Funziona per me (g ++), ma non sono sicuro se è garantito lavorare.

risposta

42

Funziona se l'iteratore è un iteratore di accesso casuale, quali sono gli iteratori del vettore (vedere reference). La funzione STL std::advance può essere utilizzata per far avanzare un iteratore generico, ma poiché non restituisce l'iteratore, tendo a usare + se disponibile perché sembra più pulito.

C++ 11 nota

Ora c'è std::next e std::prev, che fare restituire l'iteratore, quindi se si sta lavorando nella terra di modello si possono usare per avanzare un iteratore generica e hanno ancora codice pulito.

+7

Oh, quindi non funzionerebbe per std :: list? – Frank

+2

corretto; aggiunti alcuni collegamenti alla documentazione che elencano quali funzioni dovrebbero essere disponibili per i tipi di iteratori. –

+1

No, non è così. L'operatore + significa "in un passo, salta così avanti" che un iteratore di elenchi non può fare. I supporter iteratori avanti non iterativi dell'accesso (come gli iteratori di elenchi) supportano solo l'operatore di incremento (++) per far avanzare un elemento alla volta. Come ha detto Todd, è possibile utilizzare std :: advance, che richiama ripetutamente l'operatore ++, per esprimere in modo succinto l'idea di spostare un iteratore non casuale in avanti di un numero di passaggi. –

2

Funziona con iteratori ad accesso casuale. In generale si consiglia di guardare std::advance che è più generico. Assicurati solo di comprendere le implicazioni in termini di prestazioni dell'utilizzo di questo modello di funzione.

Problemi correlati