Gibt es eine Möglichkeit, auf den Iterator zuzugreifen (angenommen, es gibt keinen Schleifenindex ..?) in einer C ++ 11-basierten for-Schleife?
Oft müssen wir mit dem ersten Element eines Containers etwas Spezielles machen und über die restlichen Elemente iterieren.
Ich suche etwas wie die c++11_get_index_of
Anweisung in diesem Pseudocode:
Ich würde es wirklich vermeiden, zu Manual Iterator im alten Stil zurückzukehren Szenario ..
Oft müssen wir etwas Besonderes mit dem ersten Element von a machen Container und iterieren über die restlichen Elemente.
Ich bin überrascht zu sehen, dass bisher niemand diese Lösung vorgeschlagen hat:
%Vor%Es hat den großen Vorteil, dass die Verzweigung aus der Schleife entfernt wird. Sie macht die Schleife viel einfacher und vielleicht kann der Compiler sie auch besser optimieren.
Wenn Sie auf der range-basierten for-Schleife bestehen, ist dies vielleicht der einfachste Weg (es gibt andere, hässlichere Wege):
%Vor%Allerdings würde ich den Zweig ernsthaft aus der Schleife entfernen, wenn Sie nur das erste Element überspringen müssen.
Nein, Sie können den Iterator nicht in einer bereichsbasierten for
-Schleife abrufen (ohne natürlich das Element im Container nachzuschlagen). Der Iterator wird vom Standard als __begin
definiert, dies ist jedoch nur für die Exposition gedacht. Wenn Sie den Iterator benötigen, verwenden Sie die normale for
-Schleife. Der Grund für die bereichsbasierte for
-Schleife liegt in den Fällen, in denen Sie die Iteration nicht selbst behandeln müssen.
Mit auto
und std::begin
und std::end
sollte Ihre for
-Schleife immer noch sehr einfach sein:
Wenn Sie über Elemente iterieren, bevorzugen Sie immer einen Algorithmus und verwenden Sie nur dann eine einfache for
-Schleife keiner der Algorithmen passt.
Die Wahl des richtigen Algorithmus hängt davon ab, was Sie mit den Elementen tun wollen ... die Sie uns noch nicht gesagt haben.
Wenn Sie das erste Element überspringen möchten, geben Sie beispielsweise Folgendes aus:
%Vor%Boost bietet eine schöne, prägnante Möglichkeit:
%Vor% Sie können make_iterator_range
in der Kopfzeile boost/range/iterator_range.hpp
finden.
Es gibt keine Möglichkeit zu wissen, wie weit ein Element innerhalb des Containers ist, ohne einen Iterator, einen Zeiger oder einen intrusiven Index zu haben. Hier ist eine einfache Methode:
%Vor%Wenn Sie das erste Element überspringen möchten, können Sie ein std :: deque und pop_front als erstes Element verwenden. Dann können Sie wie gewohnt Ihre Entfernungsschleife mit dem Container machen.
Wenn ich in einem Container mit wahlfreiem Zugriff so etwas machen muss, ist es meine Gewohnheit, über die Indizes zu iterieren.
%Vor% Der einzige knifflige Teil ist das Schreiben von indexes
, das einen Bereich von Boost-Aufrufen counting
iterators zurückgibt. Es ist einfach, einen einfachen iterierbaren Bereich von Iteratoren zu erstellen: entweder das Konzept des Boost-Bereichs zu verwenden oder eigene zu rollen.
Ein Basisbereich für einen beliebigen Iteratortyp ist:
%Vor%was Sie einen Haufen verpfuschen können, aber das ist der Kern.