In der Regel werden Iteratoren verwendet, um linear auf Elemente eines Containers zuzugreifen. Mit "Iteratoren mit wahlfreiem Zugriff" ist es jedoch möglich, auf jedes Element auf dieselbe Weise wie auf zuzugreifen operator[]
.
Um auf beliebige Elemente in einem Vektor zuzugreifen vec
, können Sie Folgendes verwenden:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
Das folgende Beispiel zeigt ein typisches Zugriffsmuster (frühere Versionen von C ++):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Der Vorteil der Verwendung des Iterators besteht darin, dass Sie dasselbe Muster auf andere Container anwenden können :
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
Aus diesem Grund ist es wirklich einfach, Vorlagencode zu erstellen, der unabhängig vom Containertyp gleich funktioniert . Ein weiterer Vorteil von Iteratoren besteht darin, dass nicht davon ausgegangen wird, dass sich die Daten im Speicher befinden. Beispielsweise könnte man einen Vorwärtsiterator erstellen, der Daten aus einem Eingabestream lesen kann oder der einfach Daten im laufenden Betrieb generiert (z. B. einen Bereichs- oder Zufallszahlengenerator).
Eine weitere Option mit std::for_each
und Lambdas:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
Seit C ++ 11 können Sie auto
vermeiden, einen sehr langen, komplizierten Typnamen des Iterators wie zuvor angegeben (oder noch komplexer) anzugeben:
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Außerdem gibt es für jede Variante eine einfachere:
sum = 0;
for (auto value : vec) {
sum += value;
}
Und schließlich müssen std::accumulate
Sie auch vorsichtig sein, ob Sie Ganzzahlen oder Gleitkommazahlen hinzufügen.