std::ranges::subrange
Von cppreference.com
| Definiert in der Header-Datei <ranges> |
||
| template< std::input_or_output_iterator I, |
(1) | (seit C++20) |
| Hilfskonzepte |
||
template<class From, class To> concept /*uses-nonqualification-pointer-conversion*/ = |
(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. Entsprichttemplate<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 isttemplate<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) | |
Observer | |
| holt den Iterator (public member function) | |
| holt den Sentinel (public member function) | |
prüft, ob der subrange leer ist(public member function) | |
holt die Größe des subrange(public member function) | |
Iterator-Operationen | |
| verschiebt den Iterator um den gegebenen Abstand (public member function) | |
holt eine Kopie des subrange, bei der der Iterator um einen gegebenen Abstand dekrementiert wurde(public member function) | |
holt eine Kopie des subrange, bei der der Iterator um einen gegebenen Abstand avanciert wurde(public member function) | |
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>) |
| (C++23) |
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| 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>) | |
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>) | |
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>) | |
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>) | |
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>) | |
[bearbeiten] Deduktionshilfen
[bearbeiten] Nicht-Member-Funktionen
| (C++20) |
holt Iterator oder Sentinel aus einem std::ranges::subrange (Funktionsvorlage) |
[bearbeiten] Hilfstypen
| (C++20) |
spezifiziert, ob ein std::ranges::subrange std::ranges::sized_range modelliert (enum) |
| holt die Größe eines std::ranges::subrange (Klassentemplate-Spezialisierung) | |
| holt den Typ des Iterators oder des Sentinels eines std::ranges::subrange (Klassentemplate-Spezialisierung) |
[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
Führen Sie diesen Code aus
#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
| (C++20) |
Hilfsklassen-Template zur Definition eines view unter Verwendung des Curiously Recurring Template Pattern(Klassen-Template) |
[bearbeiten] Externe Links
Lese/schreibe alle Werte einer std::multimap mit einem bestimmten Schlüssel in C++20 — SO |