Das Ziel besteht darin, auf das "n-te" Element eines Zeichenfolgenvektors anstelle des Operators [] oder der Methode "at" zuzugreifen. Soweit ich weiß, können Iteratoren verwendet werden, um durch Container zu navigieren, aber ich habe noch nie zuvor Iteratoren verwendet, und was ich lese, ist verwirrend.
Wenn mir jemand Informationen darüber geben könnte, wie dies erreicht werden kann, würde ich es begrüßen. Danke dir.
Antworten:
Sie müssen die Methode
begin
undend
dervector
Klasse verwenden, die den Iterator zurückgibt, der auf das erste bzw. das letzte Element verweist.quelle
std::vector
Iteratoren mit wahlfreiem Zugriff vorhanden sind.std::advance(it, n)
. Es ist so definiert, dass es genau das tut, was Sie wollen, und es wird automatisch verwendet,it + n
wenn der Iterator als Direktzugriff markiert ist, oder es wird die Schleife ausgeführt, wenn dies erforderlich ist.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:Das folgende Beispiel zeigt ein typisches Zugriffsmuster (frühere Versionen von C ++):
Der Vorteil der Verwendung des Iterators besteht darin, dass Sie dasselbe Muster auf andere Container anwenden können :
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:Seit C ++ 11 können Sie
auto
vermeiden, einen sehr langen, komplizierten Typnamen des Iterators wie zuvor angegeben (oder noch komplexer) anzugeben:Außerdem gibt es für jede Variante eine einfachere:
Und schließlich müssen
std::accumulate
Sie auch vorsichtig sein, ob Sie Ganzzahlen oder Gleitkommazahlen hinzufügen.quelle
In C ++ - 11 können Sie Folgendes tun:
Variationen finden Sie hier: https://en.cppreference.com/w/cpp/language/range-for
quelle
7.5.0
unter Ubuntu 18.04 und funktioniert für Array auf die gleiche Weise.Die Iteratoren von Vector sind Iteratoren mit wahlfreiem Zugriff, was bedeutet, dass sie wie einfache Zeiger aussehen und sich anfühlen.
Sie können auf das n-te Element zugreifen, indem Sie dem von der Containermethode zurückgegebenen Iterator n hinzufügen
begin()
, oder Sie können den Operator verwenden[]
.Alternativ können Sie die Erweiterungsfunktion verwenden, die mit allen Arten von Iteratoren funktioniert. (Sie müssten überlegen, ob Sie wirklich einen "Direktzugriff" mit Iteratoren ohne Direktzugriff durchführen möchten, da dies möglicherweise eine teure Sache ist.)
quelle
advance
Iteratoren mit wahlfreiem Zugriff oder Iteratoren unbekannter Kategorie verwenden, da in diesem Fall ein konstanter Betrieb garantiert ist. Aus diesem Grund sollten benutzerdefinierte Iteratoren korrekt gekennzeichnet werden.advance
ist wirklich ärgerlich zu verwenden (wegen der Verwendung von Out-Parametern), wenn Sie wissen, dass Sie mit Iteratoren mit wahlfreiem Zugriff zu tun haben. Würde nur in generischem Code empfehlen und wenn nicht viel verwendet (wenn der Algorithmus Iteratoren mit nicht wahlfreiem Zugriff nicht gut unterstützt, könnte es so sein -std::sort
könnte beispielsweise eine sortierenstd::list
, aber nicht, weil es lächerlich ineffizient wäre ).operator+
. Bei der Frage ging es jedoch explizit um Vektor, sodass am ersten Teil Ihrer Antwort nichts auszusetzen ist. Ich dachte nur, der zweite Teil könnte bedeuten, dass Sie "Advance nicht mit Iteratoren mit wahlfreiem Zugriff verwenden können, selbst wenn Sie möchten" für jemanden, der es noch nieadvance
zuvor gesehen hat.Vector
sollte Kleinbuchstaben seinHier ist ein Beispiel für den Zugriff auf den
ith
Index von astd::vector
mithilfe einerstd::iterator
innerhalb einer Schleife, für die keine Inkrementierung von zwei Iteratoren erforderlich ist.Ohne for-Schleife
und mit
at
Methode:quelle