2011-01-17 13 views
7

Ich möchte einen Iterator (beliebiger Art) mit dem Nachfolger eines anderen Iterators (der gleichen Art) initialisieren. Der folgende Code arbeitet mit wahlfreiem Zugriff Iteratoren, aber es funktioniert nicht mit nach vorn oder bidirektionale Iteratoren:Iterator-Nachfolger

Iterator i = j + 1; 

Eine einfache Abhilfe ist:

Iterator i = j; 
++i; 

Aber das funktioniert nicht als init-abgetan von eine for-Schleife. Ich konnte eine Funktionsschablone wie folgt verwendet werden:

template <typename Iterator> 
Iterator succ(Iterator it) 
{ 
    return ++it; 
} 

und es dann wie folgt verwenden:

Iterator i = succ(j); 

Gibt es so etwas in den STL oder Boost, oder gibt es eine noch bessere Lösung, die ich bin mir dessen nicht bewusst?

+1

Sie sagen, dass Iterator i = j; ++ i; 'ist in einer' for' -Schleife nicht möglich - kannst du das erweitern? Es sollte in einer 'for' Schleife gut funktionieren. –

+0

@Michael: Ich meinte die Stelle 'x' in' für (x; y; z) ', nicht innerhalb des Schleifenkörpers selbst. – fredoverflow

+0

Ich verstehe; Das macht Sinn. –

Antwort

14

Ich denke, Sie suchen nach next in Boost.Utility. Es hat auch prior zum Erhalten eines Iterators zu einem vorherigen Element.

Update:

C 11 ++ std::next und std::prev eingeführt.

+0

der Vollständigkeit wegen gibt es auch 'prev' :) –

+0

@Matthiew M .: Ich denke, du meinst 'vorher'. Es ist in meinem Link. Jetzt fügte ich meiner Antwort eine Erwähnung hinzu. –

+0

'next' ist jetzt Teil von C++ 11 http://en.cppreference.com/w/cpp/iterator/next – alfC