2012-04-13 9 views
40

Sagen Sie, ich habe eine std::list<int> lst und einige std::list<int>::iterator it für das Durchlaufen der Liste. Und abhängig von Wert der it Ich möchte it + 1 oder it - 1 in meinem Code verwenden. Gibt es eine gute Möglichkeit, das zu tun, wie next(), prev() (ich konnte solche Dinge nicht in der Dokumentation stl finden)? Oder sollte ich die it jedes Mal kopieren und die Kopie erhöhen (dekrementieren)?Wie kommt das nächste (vorherige) Element in std :: list, ohne den Iterator zu inkrementieren (dekrementieren)?

+0

Wenn Sie 'it ++' tun, wird es als 'it = it + 1' übersetzt, was technisch das bedeutet Iterator - Objekt könnte auch immer ein neues Objekt sein Nicht sicher, was Sie fragen – Neil

+3

Das Kopieren und Inkrementieren/Dekrementieren der Kopie stellt die einzige Möglichkeit dar. Sie können Wrapper - Funktionen schreiben, um sie auszublenden (und wie in Antworten, C++ 11 hat 'std :: prev' /' std :: next', die genau das tun. Aber sie sind Wrapper um diese "Kopieren und Inkrementieren" -Operation – jalf

+0

Danke @jalf. Ihre Antwort ist die einzige vollständige Antwort. –

Antwort

17

Kopieren und Inkrementieren/Dekrementieren der Kopie ist die einzige Möglichkeit, es getan werden kann.

Sie können Wrapper-Funktionen schreiben, um sie zu verstecken (und wie in Antworten erwähnt, C++ 11 hat std :: prev/std :: next, die genau das tun (und Boost definiert ähnliche Funktionen). Aber sie sind Wrapper herum Diese "Kopieren und Inkrementieren" -Operation, so dass Sie sich keine Sorgen machen müssen, dass Sie es "falsch" machen.

5

Eine einfache vorgetastete Lösung sind prior und next von Boost.utility. Sie nutzen die Vorteile operator-- und operator++, aber Sie müssen nicht eine temporäre erstellen.

+2

Natürlich sollte erwähnt werden, dass 1. Sie das temporäre selbst erstellen und 2. Sie sollten sich der Randbedingungen bewusst sein. –

39

Ja, seit C++ 11 gibt es zwei Methoden, die Sie suchen: std::prev und std::next. Sie finden sie in der Iterator-Bibliothek.

Beispiel von cppreference.com

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::list<int> v{ 3, 1, 4 }; 

    auto it = v.begin(); 

    auto nx = std::next(it, 2); 

    std::cout << *it << ' ' << *nx << '\n'; 
} 

Ausgang:

3 4 
+4

Und natürlich, wenn Sie nicht C++ 11 haben, sind sie sehr einfach zu implementieren. (Ich denke, die meisten von uns hatten sie in unseren Toolkits, lange bevor sie überhaupt für C++ 11 vorgeschlagen wurden.) –

+0

das war der Trick –

Verwandte Themen