Beim Iterieren über Elemente eines Vektors ist es vorzuziehen, Iteratoren anstelle eines Indexes zu verwenden (siehe Why use iterators instead of array indices?).Erhalte einen Index in einen Vektor mit Iteratoren
std::vector<T> vec;
std::vector<T>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
{
// do work
}
Es kann jedoch notwendig sein, den Index im Körper der Schleife zu verwenden. Welche der folgenden Situationen wäre in diesem Fall vorzuziehen, wenn man Leistung und Flexibilität/Erweiterbarkeit berücksichtigt?
- Revert an den indexierten Schleife
std::vector vec; size_t i; for (i = 0; i < vec.size(); ++i) { // use i }
- berechnen Offset
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = it - vec.begin(); // use i }
- Verwendung std :: Abstand
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = std::distance(vec.begin(), it); // use i }
Vergessen zu erwähnen Leistung, im Allgemeinen ist es sicher anzunehmen, dass die indexierte Schleife eine bessere Leistung hätte, aber die Leistung wäre in beiden Fällen sehr ähnlich. – Guvante
Ich kann nicht sagen, ich stimme zu. Der Hauptteil der Schleife kann anderen Code enthalten, der den Iterator dereferenziert. Iteratoren sollen Ihren Code nicht einfacher machen, sie machen Ihren Code generischer. Wenn Sie die Iteratoren verwenden, können Sie den Vektor gegen eine Liste austauschen und er würde immer noch funktionieren. – QBziZ
Auch std :: map oder std :: set Iteratoren sind alles andere als dumm. Wenn ich alle möglichen Schlüssel durchlaufen würde, würde es wahrscheinlich ewig dauern. Außerdem müsste ich einen O (log (n)) Lookup für jeden Schlüssel durchführen. Also würde meine Schleife O (m * log (n)) dauern. Mit einem Iterator konnte ich die Sammlung in O (n) Zeit durchlaufen. –