Namensräume
Varianten
Aktionen

std::ranges::next

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Iterator-Operationen
(C++11)  
(C++11)
ranges::next
(C++20)
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
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.

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.
2) Konstant, wenn I std::random_access_iterator modelliert; andernfalls linear.
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

#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

dekrementiert einen Iterator um eine gegebene Distanz oder zu einer Grenze
(Algorithmus-Funktionsobjekt)[bearbeiten]
bewegt einen Iterator um die angegebene Distanz vorwärts oder zu einer gegebenen Grenze
(Algorithmus-Funktionsobjekt)[bearbeiten]
(C++11)
inkrementiert einen Iterator
(Funktionsvorlage) [bearbeiten]