In genere, gli iteratori vengono utilizzati per accedere agli elementi di un contenitore in modo lineare; tuttavia, con gli "iteratori ad accesso casuale", è possibile accedere a qualsiasi elemento allo stesso modo di operator[].
Per accedere a elementi arbitrari in un vettore vec , puoi utilizzare quanto segue:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
Di seguito è riportato un esempio di un tipico modello di accesso (versioni precedenti di C ++):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Il vantaggio dell'utilizzo dell'iteratore è che puoi applicare lo stesso modello con altri contenitori :
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
Per questo motivo, è davvero facile creare codice modello che funzionerà allo stesso modo indipendentemente dal tipo di contenitore . Un altro vantaggio degli iteratori è che non presume che i dati siano residenti in memoria; per esempio, si potrebbe creare un iteratore in avanti in grado di leggere i dati da un flusso di input o che semplicemente genera dati al volo (ad esempio un intervallo o un generatore di numeri casuali).
Un'altra opzione che usa std::for_eache lambda:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
Dal momento che C ++ 11 puoi usare autoper evitare di specificare un nome di tipo molto lungo e complicato dell'iteratore come visto prima (o anche più complesso):
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Inoltre, c'è una variante più semplice per ogni variante:
sum = 0;
for (auto value : vec) {
sum += value;
}
E infine c'è anche std::accumulatedove devi stare attento se stai aggiungendo numeri interi o in virgola mobile.