std::ranges::views::common, std::ranges::common_view
Von cppreference.com
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::view V > erfordert (nicht ranges::common_range<V> und |
(1) | (seit C++20) |
| namespace views { inline constexpr /* nicht spezifiziert */ common = /* nicht spezifiziert */; |
(2) | (seit C++20) |
| Aufruf-Signatur |
||
| template< ranges::viewable_range R > requires /* siehe unten */ |
(seit C++20) | |
1) Passt eine gegebene
view mit unterschiedlichen Typen für Iterator/Sentinel-Paare an eine view an, die ebenfalls eine common_range ist. Eine common_view hat immer den gleichen Iterator/Sentinel-Typ.2) RangeAdaptorObject. Sei e ein Unterausdruck. Dann ist der Ausdruck views::common(e) ausdrucksäquivalent zu
- views::all(e), wenn es ein wohlgeformter Ausdruck ist und decltype((e))
common_rangemodelliert; - common_view{e} andernfalls.
Inhalt |
[edit] Datenelemente
| Mitglied | Beschreibung |
V base_ (private) |
die zugrunde liegende Ansicht ((exposition-only member object*) |
[edit] Memberfunktionen
konstruiert eine common_view(öffentliche Member-Funktion) | |
| gibt eine Kopie der zugrunde liegenden (angepassten) View zurück (public member function) | |
| gibt einen Iterator zum Anfang zurück (öffentliche Member-Funktion) | |
| gibt einen Iterator zum Ende zurück (öffentliche Member-Funktion) | |
gibt die Anzahl der Elemente zurück, nur bereitgestellt, wenn die zugrunde liegende (adaptierte) Range sized_range erfüllt(öffentliche Member-Funktion) | |
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>) | |
| (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>) | |
[edit] Deduktionsleitfäden
[edit] Hilfsschablonen
| template< class T > constexpr bool enable_borrowed_range<std::ranges::common_view<T>> = |
(seit C++20) | |
Diese Spezialisierung von std::ranges::enable_borrowed_range lässt common_view borrowed_range erfüllen, wenn die zugrunde liegende View dies tut.
[edit] Anmerkungen
common_view kann nützlich sein für die Arbeit mit älteren Algorithmen, die erwarten, dass Iterator und Sentinel denselben Typ haben.
[edit] Beispiel
Führen Sie diesen Code aus
#include <iostream> #include <iterator> #include <list> #include <numeric> #include <ranges> int main() { auto v1 = {1, 2, 3, 4, 5}; auto i1 = std::counted_iterator{v1.begin(), std::ssize(v1)}; auto r1 = std::ranges::subrange{i1, std::default_sentinel}; // auto e1 = std::accumulate(r1.begin(), r1.end(), 0); // error: "common range" required auto c1 = std::ranges::common_view{r1}; std::cout << "accumulate: " << std::accumulate(c1.begin(), c1.end(), 0) << '\n'; // inherited from ranges::view_interface: std::cout << "c1.front(): " << c1.front() << '\n'; std::cout << "c1.back(): " << c1.back() << '\n'; std::cout << "c1.data(): " << c1.data() << '\n'; std::cout << "c1[0]: " << c1[0] << '\n'; auto v2 = std::list{1, 2, 3, 4, 5}; auto i2 = std::counted_iterator{v2.begin(), std::ssize(v2)}; auto r2 = std::ranges::subrange{i2, std::default_sentinel}; // auto e2 = std::accumulate(r2.begin(), r2.end(), 0); // error: "common range" required auto c2 = std::ranges::common_view{ r2 }; std::cout << "accumulate: " << std::accumulate(c2.begin(), c2.end(), 0) << '\n'; // inherited from ranges::view_interface: std::cout << "c2.front(): " << c2.front() << '\n'; // auto e3 = c2.back(); // error: "bidirectional range" required // auto e4 = c2.data(); // error: "contiguous range" required // auto e5 = c2[0]; // error: "random access range" required }
Mögliche Ausgabe
accumulate: 15 c1.front(): 1 c1.back(): 5 c1.data(): 0x7f19937f00d0 c1[0]: 1 accumulate: 15 c2.front(): 1
[edit] 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 | common_view war nie ein borrowed_range |
sie ist eine borrowed_range, wenn ihre zugrundeliegende View es ist |
[edit] Siehe auch
| (C++20) |
spezifiziert, dass ein Range identische Iterator- und Sentinel-Typen hat (Konzept) |
| (C++20) |
passt einen Iteratortyp und dessen Sentinel an einen gemeinsamen Iteratortyp an (Klassenvorlage) |