Namensräume
Varianten
Aktionen

std::ranges::subrange

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Ansichten
subrange

Range-Adaptoren
 
 
Definiert in der Header-Datei <ranges>
template<

    std::input_or_output_iterator I,
    std::sentinel_for<I> S = I,
    ranges::subrange_kind K = std::sized_sentinel_for<S, I> ?
                                  ranges::subrange_kind::sized :
                                  ranges::subrange_kind::unsized
>
    requires (K == ranges::subrange_kind::sized ||
                 !std::sized_sentinel_for<S, I>)
class subrange

    : public ranges::view_interface<subrange<I, S, K>>
(1) (seit C++20)
Hilfskonzepte
template<class From, class To>

concept /*uses-nonqualification-pointer-conversion*/ =

    /* siehe Beschreibung */;
(2) (nur Exposition*)
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* siehe Beschreibung */;
(3) (nur Exposition*)
1) Die Klassenvorlage subrange kombiniert einen Iterator und einen Sentinel zu einer einzigen view. Sie modelliert sized_range, wenn der letzte Template-Parameter subrange_kind​::​sized ist (was geschieht, wenn std::sized_sentinel_for<S, I> erfüllt ist oder wenn die Größe explizit als Konstruktorargument übergeben wird).
2) Bestimmt, ob From ohne Qualifizierungskonvertierungen in To konvertierbar ist. Entspricht
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    std::is_pointer_v<From> && std::is_pointer_v<To> &&
        !std::convertible_to<std::remove_pointer_t<From>(*)[],
                             std::remove_pointer_t<To>(*)[]>;
3) Bestimmt, ob From ohne abgeleitete-zu-Basis-Konvertierung in To konvertierbar ist
template<class From, class To>
concept /*convertible-to-non-slicing*/ =
    std::convertible_to<From, To> &&
        !/*uses-nonqualification-pointer-conversion*/
            <std::decay_t<From>, std::decay_t<To>>;

Inhalt

[bearbeiten] Datenelemente

Mitglied Definition
constexpr bool StoreSize [statisch] K == ranges::subrange_kind::sized &&
    !std::sized_sentinel_for<S, I>

((exposition-only static member constant*)
I begin_ ein Iterator zum Anfang des Teilbereichs
((exposition-only member object*)
S end_ ein Sentinel, der das Ende des Teilbereichs kennzeichnet
((exposition-only member object*)
make-unsigned-like-t <std::iter_difference_t<I>> size_
(nur vorhanden, wenn StoreSize true ist)
die Größe des Teilbereichs
((exposition-only member object*)

[bearbeiten] Member-Funktionen

erzeugt einen neuen subrange
(öffentliche Memberfunktion)
konvertiert den subrange in einen paar-ähnlichen Typ
(public member function) [bearbeiten]
Observer
holt den Iterator
(public member function) [bearbeiten]
holt den Sentinel
(public member function) [bearbeiten]
prüft, ob der subrange leer ist
(public member function) [bearbeiten]
holt die Größe des subrange
(public member function) [bearbeiten]
Iterator-Operationen
verschiebt den Iterator um den gegebenen Abstand
(public member function) [bearbeiten]
holt eine Kopie des subrange, bei der der Iterator um einen gegebenen Abstand dekrementiert wurde
(public member function) [bearbeiten]
holt eine Kopie des subrange, bei der der Iterator um einen gegebenen Abstand avanciert wurde
(public member function) [bearbeiten]
Geerbt von std::ranges::view_interface
(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 die Adresse der Daten der abgeleiteten Ansicht zurück, nur bereitgestellt, wenn ihr Iteratortyp contiguous_iterator erfüllt
(öffentliche Memberfunktion von 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]

[bearbeiten] Deduktionshilfen

[bearbeiten] Nicht-Member-Funktionen

holt Iterator oder Sentinel aus einem std::ranges::subrange
(Funktionsvorlage) [bearbeiten]

[bearbeiten] Hilfstypen

spezifiziert, ob ein std::ranges::subrange std::ranges::sized_range modelliert
(enum) [bearbeiten]
holt die Größe eines std::ranges::subrange
(Klassentemplate-Spezialisierung) [bearbeiten]
holt den Typ des Iterators oder des Sentinels eines std::ranges::subrange
(Klassentemplate-Spezialisierung) [bearbeiten]

[bearbeiten] Hilfsvorlagen

template< class I, class S, ranges::subrange_kind K >
constexpr bool ranges::enable_borrowed_range<ranges::subrange<I, S, K>> = true;
(seit C++20)

Diese Spezialisierung von ranges::enable_borrowed_range lässt subrange borrowed_range erfüllen.

[bearbeiten] Beispiel

#include <map>
#include <print>
#include <ranges>
 
void make_uppercase(char& v)
{
    v += 'A' - 'a';
}
 
void uppercase_transform(std::multimap<int, char>& m, int k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        make_uppercase(v);
}
 
int main()
{
    std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}};
    std::println("Before: {}", mm);
    uppercase_transform(mm, 4);
    std::println("After:  {}", mm);
}

Ausgabe

Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After:  {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}

[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 3470 C++20 convertible-to-non-slicing könnte Qualifizierungskonvertierungen ablehnen akzeptiert sie immer

[bearbeiten] Siehe auch

Hilfsklassen-Template zur Definition eines view unter Verwendung des Curiously Recurring Template Pattern
(Klassen-Template) [edit]

[bearbeiten] Externe Links

Lese/schreibe alle Werte einer std::multimap mit einem bestimmten Schlüssel in C++20 — SO