In Bereichsbasiert überspringen basierend auf 'index'?

8

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:

%Vor%

Ich würde es wirklich vermeiden, zu Manual Iterator im alten Stil zurückzukehren Szenario ..

    
Jay 19.01.2014, 11:09
quelle

7 Antworten

16
  

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.

    
Ali 19.01.2014, 11:59
quelle
2

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:

%Vor%     
Joseph Mansfield 19.01.2014 11:18
quelle
2

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%     
Karoly Horvath 19.01.2014 11:35
quelle
2

Wie wäre es mit einer einfachen for-Schleife mit Iteraten:

%Vor%

Es ist nicht bereichsbasiert, aber es ist funktional. Falls Sie die Entfernungsschleife trotzdem verwenden möchten:

%Vor%     
Netwave 19.01.2014 11:20
quelle
2

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.

    
Sam Kellett 16.01.2015 10:48
quelle
0

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.

    
nurettin 19.01.2014 11:24
quelle
0

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.

    
Yakk 19.01.2014 12:41
quelle

Tags und Links