std::ranges::next
Von cppreference.com
| Definiert in Header <iterator> |
||
| Aufruf-Signatur |
||
| template< std::input_or_output_iterator I > constexpr I next( I i ); |
(1) | (seit C++20) |
| template< std::input_or_output_iterator I > constexpr I next( I i, std::iter_difference_t<I> n ); |
(2) | (seit C++20) |
| template< std::input_or_output_iterator I, std::sentinel_for<I> S > constexpr I next( I i, S bound ); |
(3) | (seit C++20) |
| template< std::input_or_output_iterator I, std::sentinel_for<I> S > constexpr I next( I i, std::iter_difference_t<I> n, S bound ); |
(4) | (seit C++20) |
Gibt den n-ten Nachfolger des Iterators i zurück.
Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als niebloids bekannt), d.h.
- Können explizite Template-Argumentlisten bei keinem von ihnen angegeben werden.
- Keiner von ihnen ist für Argument-abhängige Suche sichtbar.
- Wenn einer von ihnen durch normale unqualifizierte Suche als Name links vom Funktionsaufrufoperator gefunden wird, wird die Argument-abhängige Suche unterdrückt.
Inhalt |
[edit] Parameter
| i | - | ein Iterator |
| n | - | Anzahl der vorzurückenden Elemente |
| bound | - | Sentinel, der das Ende des Bereichs bezeichnet, auf den i zeigt |
[edit] Rückgabewert
1) Der Nachfolger des Iterators i.
2) Der n-te Nachfolger des Iterators i.
3) Der erste Iterator, der äquivalent zu bound ist.
4) Der n-te Nachfolger des Iterators i oder der erste Iterator, der äquivalent zu bound ist, je nachdem, was zuerst eintritt.
[edit] Komplexität
1) Konstant.
3) Konstant, wenn
I und S sowohl std::random_access_iterator<I> als auch std::sized_sentinel_for<S, I> modellieren oder wenn I und S std::assignable_from<I&, S> modellieren; andernfalls linear.4) Konstant, wenn
I und S sowohl std::random_access_iterator<I> als auch std::sized_sentinel_for<S, I> modellieren; andernfalls linear.[edit] Mögliche Implementierung
struct next_fn { template<std::input_or_output_iterator I> constexpr I operator()(I i) const { ++i; return i; } template<std::input_or_output_iterator I> constexpr I operator()(I i, std::iter_difference_t<I> n) const { ranges::advance(i, n); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, S bound) const { ranges::advance(i, bound); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, std::iter_difference_t<I> n, S bound) const { ranges::advance(i, n, bound); return i; } }; inline constexpr auto next = next_fn(); |
[edit] Hinweise
Obwohl der Ausdruck ++x.begin() oft kompiliert, ist dies nicht garantiert: x.begin() ist ein rvalue-Ausdruck, und es gibt keine Anforderung, die besagt, dass die Inkrementierung eines rvalue garantiert funktioniert. Insbesondere, wenn Iteratoren als Zeiger implementiert sind oder ihr operator++ lvalue-ref-qualifiziert ist, kompiliert ++x.begin() nicht, während ranges::next(x.begin()) kompiliert.
[edit] Beispiel
Führen Sie diesen Code aus
#include <cassert> #include <iterator> int main() { auto v = {3, 1, 4}; { auto n = std::ranges::next(v.begin()); assert(*n == 1); } { auto n = std::ranges::next(v.begin(), 2); assert(*n == 4); } { auto n = std::ranges::next(v.begin(), v.end()); assert(n == v.end()); } { auto n = std::ranges::next(v.begin(), 42, v.end()); assert(n == v.end()); } }
[edit] Siehe auch
| (C++20) |
dekrementiert einen Iterator um eine gegebene Distanz oder zu einer Grenze (Algorithmus-Funktionsobjekt) |
| (C++20) |
bewegt einen Iterator um die angegebene Distanz vorwärts oder zu einer gegebenen Grenze (Algorithmus-Funktionsobjekt) |
| (C++11) |
inkrementiert einen Iterator (Funktionsvorlage) |