Namespaces
Variants

std::ranges::subrange

Von de.cppreference.net
 
 
Ranges-Bibliothek
Range-Adaptoren
 
 
Definiert in Header <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*/ =
    /* see description */;
(2) (nur zur Darstellung*)
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* see description */;
(3) (nur zur Darstellung*)
1) Die subrange-Klassenvorlage fasst einen Iterator und einen Sentinel in einem einzigen view zusammen. Sie modelliert sized_range, wenn der letzte Vorlagenparameter subrange_kind​::​sized ist (was der Fall ist, wenn std::sized_sentinel_for<S, I> erfüllt ist oder die Größe explizit als Konstruktorargument übergeben wird).
2) Bestimmt, ob From in To ohne Qualifikationskonvertierungen konvertierbar ist. Äquivalent zu:
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 in To ohne Ableitung-zu-Basis-Konvertierung 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>>;

Datenelemente

Element Beschreibung
constexpr bool StoreSize [static] K == ranges::subrange_kind::sized &&
    !std::sized_sentinel_for<S, I>

(nur zur Darstellung, statische Elementkonstante*)
I begin_ ein Iterator zum Anfang des Teilbereichs
(nur zur Darstellung, Elementobjekt*)
S end_ eine Endmarkierung, die das Ende des Teilbereichs angibt
(nur zur Darstellung, Elementobjekt*)
make-unsigned-like-t <std::iter_difference_t<I>> size_
(nur vorhanden, wenn StoreSize gleich true ist)
die Größe des Teilbereichs
(nur zur Darstellung, Elementobjekt*)

Memberfunktionen

erstellt einen neuen subrange
(öffentliche Elementfunktion)
konvertiert den subrange in einen pair-like Typ
(öffentliche Elementfunktion)
Beobachter
erhält den Iterator
(öffentliche Elementfunktion)
erhält den Sentinel
(öffentliche Elementfunktion)
prüft, ob der subrange leer ist
(öffentliche Elementfunktion)
erhält die Größe des subrange
(öffentliche Elementfunktion)
Iterator-Operationen
bewegt den Iterator um eine gegebene Distanz
(öffentliche Elementfunktion)
erhält eine Kopie des subrange mit seinem Iterator um eine gegebene Distanz dekrementiert
(öffentliche Elementfunktion)
erhält eine Kopie des subrange mit seinem Iterator um eine gegebene Distanz inkrementiert
(öffentliche Elementfunktion)
Geerbt von ranges::view_interface
(C++23)
gibt einen konstanten Iterator zum Beginn der Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
(C++23)
gibt einen Sentinel für den konstanten Iterator der Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt zurück, ob die abgeleitete Sicht nicht leer ist, nur bereitgestellt, wenn ranges::empty auf sie anwendbar ist
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
ermittelt die Adresse der Daten der abgeleiteten Sicht, nur bereitgestellt, wenn ihr Iteratortyp contiguous_iterator
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das erste Element in der abgeleiteten Sicht zurück, bereitgestellt, wenn sie forward_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das letzte Element in der abgeleiteten Sicht zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das nte Element in der abgeleiteten Sicht zurück, nur bereitgestellt, wenn sie random_access_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)

Deduction-Guides

Nicht-Member-Funktionen

erhält Iterator oder Sentinel aus einem std::ranges::subrange
(Funktions-Template)

Hilfstypen

spezifiziert, ob ein std::ranges::subrange das Konzept std::ranges::sized_range modelliert
(Enumeration)
ermittelt die Größe eines std::ranges::subrange
(Klassentemplatespezialisierung)
ermittelt den Typ des Iterators oder des Sentinels eines std::ranges::subrange
(Klassentemplatespezialisierung)

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 bewirkt, dass subrange die Anforderungen von borrowed_range erfüllt.

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: '-'}

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 3470 C++20 convertible-to-non-slicing könnte Qualifikationskonvertierungen ablehnen akzeptiert sie immer

Siehe auch

Hilfsklassen-Template zur Definition einer view unter Verwendung des Curiously Recurring Template Pattern
(Klassen-Template)

Externe Links

Lesen/Schreiben aller Werte eines std::multimap mit einem gegebenen Schlüssel in C++20 — SO