Namensräume
Varianten
Aktionen

std::ranges::views::reverse, std::ranges::reverse_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
template< ranges::view V >

    erfordert ranges::bidirectional_range<V>
class reverse_view

    : public ranges::view_interface<reverse_view<V>>
(1) (seit C++20)
namespace views {

    inline constexpr /* nicht spezifiziert */ reverse = /* nicht spezifiziert */;

}
(2) (seit C++20)
Aufruf-Signatur
template< ranges::viewable_range R >

    requires /* siehe unten */

constexpr ranges::view auto reverse( R&& r );
(seit C++20)
1) Ein Bereichsadapter, der eine Ansicht der zugrundeliegenden view in umgekehrter Reihenfolge darstellt.
2) RangeAdaptorObject. Der Ausdruck views::reverse(e) ist ausdrucksäquivalent zu einem der folgenden Ausdrücke, mit der Ausnahme, dass e nur einmal ausgewertet wird.
  • e.base(), wenn der Typ von e eine (möglicherweise cv-qualifizierte) Spezialisierung von reverse_view ist;
  • andernfalls, wenn der Typ von e ein (möglicherweise cv-qualifizierter) ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K> für einen Iterator-Typ I und einen Wert K vom Typ ranges::subrange_kind ist.
  • ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), wenn K ranges::subrange_kind::sized ist;
  • andernfalls ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
  • andernfalls ranges::reverse_view{e}.
Anders ausgedrückt, views::reverse entpackt umgekehrte Ansichten, wenn möglich.

Eine reverse_view modelliert immer bidirectional_range und common_range und modelliert borrowed_range, sized_range oder random_access_range, wenn der zugrundeliegende Ansichtstyp V das entsprechende Konzept modelliert.

Inhalt

[bearbeiten] Datenmember

Mitglied Beschreibung
V base_ (privat) die zugrunde liegende Ansicht
((exposition-only member object*)
non-propagating-cache<ranges::iterator_t<V>> cached_end_ (private)
(vorhanden nur, wenn V common_range nicht erfüllt)
ein Objekt, das das Ergebnis von Aufrufen von begin() zwischenspeichert
((exposition-only member object*)

[bearbeiten] Member-Funktionen

konstruiert eine reverse_view
(öffentliche Memberfunktion)
gibt die zugrunde liegende Ansicht V zurück
(öffentliche Memberfunktion)
gibt den Anfangs-Iterator der reverse_view zurück
(öffentliche Memberfunktion)
gibt den End-Iterator der reverse_view zurück
(öffentliche Memberfunktion)
gibt die Größe der Ansicht zurück, wenn sie beschränkt ist
(öffentliche Memberfunktion)
Geerbt von std::ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur, wenn sie sized_range oder forward_range erfüllt
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist
(public member function of std::ranges::view_interface<D>) [edit]
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das letzte Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das n-te Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie random_access_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]

std::ranges::reverse_view::reverse_view

reverse_view() erfordert std::default_initializable<V> = default;
(1) (seit C++20)
constexpr reverse_view( V r );
(2) (seit C++20)
1) Initialisiert base_ wertmäßig über seinen Standard-Member-Initialisierer (= V()).
2) Initialisiert base_ mit std::move(r).

Parameter

r - Bereich zum Umkehren

std::ranges::reverse_view::base

constexpr V base() const& erfordert std::copy_constructible<V>;
(1) (seit C++20)
constexpr V base() &&;
(2) (seit C++20)

Gibt die zugrunde liegende Ansicht zurück.

1) Kopiert das Ergebnis aus der zugrunde liegenden Ansicht. Entspricht return base_;.
2) Verschiebt das Ergebnis aus der zugrunde liegenden Ansicht. Entspricht return std::move(base_);.

std::ranges::reverse_view::begin

(1) (seit C++20)
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin()
    erfordert ranges::common_range<V>;
(2) (seit C++20)
constexpr auto begin() const erfordert ranges::common_range<const V>;
(3) (seit C++20)
1) Gibt std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))) zurück. Um die amortisierte konstante Zeitkomplexität zu bieten, die vom range-Konzept gefordert wird, speichert diese Funktion das Ergebnis im Cache-Objekt für spätere Aufrufe.
2,3) Äquivalent zu return std::make_reverse_iterator(ranges::end(base_));.

std::ranges::reverse_view::end

(1) (seit C++20)
constexpr auto end() const erfordert ranges::common_range<const V>;
(2) (seit C++20)

Äquivalent zu return std::make_reverse_iterator(ranges::begin(base_));.

std::ranges::reverse_view::size

constexpr auto size() requires ranges::sized_range<V>;
(1) (seit C++20)
constexpr auto size() const requires ranges::sized_range<const V>;
(2) (seit C++20)

Gibt die Größe der Ansicht zurück, wenn die Ansicht beschränkt ist.

1,2) Äquivalent zu return ranges::size(base_);.

[bearbeiten] Deduktionshilfen

template< class R >
reverse_view( R&& ) -> reverse_view<views::all_t<R>>;
(seit C++20)

[bearbeiten] Hilfsschablonen

template< class T >

constexpr bool enable_borrowed_range<std::ranges::reverse_view<T>> =

    ranges::enable_borrowed_range<T>;
(seit C++20)

Diese Spezialisierung von std::ranges::enable_borrowed_range lässt reverse_view borrowed_range erfüllen, wenn die zugrundeliegende Ansicht dies erfüllt.

[bearbeiten] Beispiel

#include <iostream>
#include <ranges>
 
int main()
{
    static constexpr auto il = {3, 1, 4, 1, 5, 9};
 
    std::ranges::reverse_view rv{il};
    for (int i : rv)
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : il | std::views::reverse)
        std::cout << i << ' ';
    std::cout << '\n';
 
    // operator[] is inherited from std::view_interface
    for (auto i{0U}; i != rv.size(); ++i)
        std::cout << rv[i] << ' ';
    std::cout << '\n';
}

Ausgabe

9 5 1 4 1 3
9 5 1 4 1 3
9 5 1 4 1 3

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3494 C++20 reverse_view war nie ein borrowed_range sie ist eine borrowed_range, wenn ihre zugrundeliegende View es ist

[bearbeiten] Siehe auch

Iterator-Adapter für die Rückwärtsiteration
(Klassenvorlage) [bearbeiten]
Kehrt die Reihenfolge der Elemente in einem Bereich um
(Algorithmus-Funktionsobjekt)[edit]
Erstellt eine Kopie eines Bereichs, der umgekehrt ist
(Algorithmus-Funktionsobjekt)[edit]