std::ranges::views::chunk_by, std::ranges::chunk_by_view
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::forward_range V, std::indirect_binary_predicate<iterator_t<V>, ranges::iterator_t<V>> Pred > |
(1) | (seit C++23) |
| namespace views { inline constexpr /* unspecified */ chunk_by = /* unspecified */ ; |
(2) | (seit C++23) |
| Aufruf-Signatur |
||
| template< ranges::viewable_range R, class Pred > requires /* siehe unten */ |
(seit C++23) | |
| template< class Pred > constexpr /*range adaptor closure*/ chunk_by( Pred&& pred ); |
(seit C++23) | |
chunk_by_view ist ein Range-Adapter, der eine view und ein aufrufbaren Objekt pred (die binäre Prädikatfunktion) entgegennimmt und eine view von Teilbereichen (Chunks) erzeugt, indem die zugrunde liegende View zwischen jedem Paar benachbarter Elemente aufgeteilt wird, für die pred false zurückgibt. Das erste Element jedes solchen Paares gehört zum vorherigen Chunk und das zweite Element gehört zum nächsten Chunk.chunk_by_view modelliert immer forward_range und modelliert bidirectional_range und/oder common_range, wenn die angepasste view-Typ die entsprechenden Konzepte modelliert. chunk_by_view modelliert nie borrowed_range oder sized_range.
Inhalt |
[edit] Datenelemente
| Mitglied | Definition |
V base_ |
die zugrunde liegende view((exposition-only member object*) |
movable-box<Pred> pred_ |
ein Objekt, das die Prädikatfunktion zum Aufteilen der Elemente von base_ umschließt((exposition-only member object*) |
non-propagating-cache<iterator> begin_ |
ein Objekt, das den Iterator zum ersten Element zwischenspeichert ((exposition-only member object*) |
[edit] Memberfunktionen
konstruiert eine chunk_by_view(öffentliche Member-Funktion) | |
| gibt eine Kopie der zugrunde liegenden (angepassten) View zurück (public member function) | |
| gibt eine Referenz auf die gespeicherte Prädikatfunktion zurück (public member function) | |
| gibt einen Iterator zum Anfang zurück (öffentliche Member-Funktion) | |
| gibt einen Iterator oder Sentinel zum Ende zurück (öffentliche Member-Funktion) | |
| gibt einen Iterator zum Beginn des nächsten Teilbereichs zurück (exposition-only Member-Funktion*) | |
| gibt einen Iterator zum Beginn des vorherigen Teilbereichs zurück (exposition-only 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 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>) | |
[edit] Deduktionshilfen
[edit] Verschachtelte Klassen
| der Iterator-Typ ((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*) |
[edit] Anmerkungen
Um die vom range-Konzept geforderte amortisierte konstante Zeitkomplexität zu bieten, wird das Ergebnis von begin() innerhalb des chunk_by_view-Objekts zwischengespeichert. Wenn der zugrunde liegende Bereich nach dem ersten Aufruf von begin() geändert wird, können nachfolgende Verwendungen des chunk_by_view-Objekts zu unerwartetem Verhalten führen.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_chunk_by |
202202L |
(C++23) | std::ranges::chunk_by_view
|
[edit] Beispiel
#include <functional> #include <iostream> #include <ranges> #include <string_view> void print_chunks(auto view, std::string_view separator = ", ") { for (auto const subrange : view) { std::cout << '['; for (std::string_view prefix; auto const& elem : subrange) std::cout << prefix << elem, prefix = separator; std::cout << "] "; } std::cout << '\n'; } int main() { std::initializer_list v1 = {1, 2, 3, 1, 2, 3, 3, 3, 1, 2, 3}; auto fn1 = std::ranges::less{}; auto view1 = v1 | std::views::chunk_by(fn1); print_chunks(view1); std::initializer_list v2 = {1, 2, 3, 4, 4, 0, 2, 3, 3, 3, 2, 1}; auto fn2 = std::ranges::not_equal_to{}; auto view2 = v2 | std::views::chunk_by(fn2); print_chunks(view2); std::string_view v3 = "__cpp_lib_ranges_chunk_by"; auto fn3 = [](auto x, auto y) { return not(x == '_' or y == '_'); }; auto view3 = v3 | std::views::chunk_by(fn3); print_chunks(view3, ""); std::string_view v4 = "\u007a\u00df\u6c34\u{1f34c}"; // "zß水🍌" auto fn4 = [](auto, auto ß) { return 128 == ((128 + 64) & ß); }; auto view4 = v4 | std::views::chunk_by(fn4); print_chunks(view4, ""); }
Ausgabe
[1, 2, 3] [1, 2, 3] [3] [3] [1, 2, 3] [1, 2, 3, 4] [4, 0, 2, 3] [3] [3, 2, 1] [_] [_] [cpp] [_] [lib] [_] [ranges] [_] [chunk] [_] [by] [z] [ß] [水] [🍌]
[edit] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 26.7.30 Chunk by view [range.chunk.by]
[edit] Siehe auch
eine Reihe von views, die N-elementige, nicht überlappende, aufeinanderfolgende Blöcke von Elementen einer anderen view sind(Klassenschablone) (Range-Adaptor-Objekt) | |
eine view, deren M-tes Element eine view über die M-ten bis (M + N - 1)-ten Elemente einer anderen view ist(Klassenschablone) (Range-Adaptor-Objekt) | |
eine view, die aus Elementen einer anderen view besteht und dabei jeweils N Elemente überspringt(Klassenschablone) (Range-Adaptor-Objekt) |