Namensräume
Varianten
Aktionen

std::experimental::ranges::advance

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
Iterator-Bibliothek
Iterator-Konzepte
Indirekte aufrufbare Konzepte
                                                  
                                                  
                                                  
Gemeinsame Algorithmus-Anforderungen
                                                  
Konzept-Dienstprogramme
Iterator-Dienstprogramme und -Operationen
advance
Iterator-Traits
Iterator-Adapter
Stream-Iteratoren
 
Definiert in Header <experimental/ranges/iterator>
namespace {

    constexpr /* nicht spezifiziert */ advance = /* nicht spezifiziert */;

}
(Ranges TS)
(Customization-Point-Objekt)
Aufruf-Signatur
template< Iterator I >
constexpr void advance( I& i, ranges::difference_type_t<I> n );
(1)
template< Iterator I, Sentinel<I> S >
constexpr void advance( I& i, S bound );
(2)
template< Iterator I, Sentinel<I> S >
constexpr ranges::difference_type_t<I> advance( I& i, ranges::difference_type_t<I> n, S bound );
(3)

Verschiebt den Iterator i um n Positionen vorwärts oder bis bound erreicht ist, je nachdem, was zuerst eintritt.

1) Wenn I RandomAccessIterator modelliert, ist dies äquivalent zu i += n. Andernfalls wird i n mal inkrementiert (oder dekrementiert, falls n negativ ist). Das Verhalten ist undefiniert, wenn n negativ ist und I BidirectionalIterator nicht modelliert.
2) Wenn Assignable<I&, S> erfüllt ist, ist dies äquivalent zu i = std::move(bound).
Andernfalls, wenn [ibound) keinen Bereich bezeichnet, ist das Verhalten undefiniert.
Andernfalls, wenn SizedSentinel<S, I> erfüllt ist, ist dies äquivalent zu ranges::advance(i, bound - i).
Andernfalls wird i inkrementiert, bis i == bound.
3) Wenn SizedSentinel<S, I> erfüllt ist, ist dies äquivalent zu ranges::advance(i, bound), wenn |n| >= |bound - i|, und ranges::advance(i, n) andernfalls.
Andernfalls wird i entweder n mal inkrementiert (oder dekrementiert, falls n negativ ist), oder bis i == bound, je nachdem, was zuerst eintritt.
Wenn n > 0, muss [ibound) einen Bereich bezeichnen; wenn n == 0, muss entweder [ibound) oder [boundi) einen Bereich bezeichnen; wenn n < 0, muss [boundi) einen Bereich bezeichnen, I und S müssen vom gleichen Typ sein und I muss BidirectionalIterator modellieren. Andernfalls ist das Verhalten undefiniert.

Inhalt

[bearbeiten] Customization Point Objects

Der Name ranges::advance bezeichnet ein Customization Point Object, das ein Function Object vom Typ einer Literal Semiregular Klasse ist (zur Veranschaulichung als AdvanceT bezeichnet). Alle Instanzen von AdvanceT sind gleich. Daher kann ranges::advance frei kopiert und seine Kopien können austauschbar verwendet werden.

Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die obigen Anforderungen für Argumente an ranges::advance erfüllen, erfüllt AdvanceT ranges::Invocable<const AdvanceT, Args...>. Andernfalls nimmt kein Funktionsaufrufoperator von AdvanceT an der Überladungsauflösung teil.

In jeder Übersetzungseinheit, in der ranges::advance definiert ist, bezieht es sich auf dieselbe Instanz des Customization Point Objects. (Dies bedeutet, dass es frei in Dingen wie Inline-Funktionen und Funktionenschablonen verwendet werden kann, ohne die Ein-Definitions-Regel zu verletzen.)

[bearbeiten] Rückgabewert

1,2) (keine)
3) Die Anzahl der Inkrement-/Dekrementoperationen, die aufgrund des Erreichens von bound nicht durchgeführt wurden. Anders ausgedrückt: n - M, wobei M der Abstand von der Startposition von i zur Endposition ist und negativ ist, wenn die Endposition vor der Startposition liegt.

[bearbeiten] Beispiel

[bearbeiten] Siehe auch

bewegt einen Iterator um die angegebene Distanz vorwärts
(Funktionsvorlage) [bearbeiten]
gibt die Distanz zwischen einem Iterator und einem Sentinel zurück, oder zwischen dem Anfang und dem Ende eines Bereichs
(Funktionsvorlage) [bearbeiten]
inkrementiert einen Iterator
(Funktionsvorlage) [bearbeiten]
dekrementiert einen Iterator
(Funktionsvorlage) [bearbeiten]