std::ranges::views::chunk, std::ranges::chunk_view
| Definiert in der Header-Datei <ranges> |
||
template< ranges::view V > requires ranges::input_range<V> |
(1) | (seit C++23) |
template< ranges::view V > requires ranges::forward_range<V> |
(2) | (seit C++23) |
| namespace views { inline constexpr /* unspecified */ chunk = /* unspecified */; |
(3) | (seit C++23) |
| Aufruf-Signatur |
||
| template< ranges::viewable_range R > constexpr ranges::view auto chunk( R&& r, ranges::range_difference_t<R> n ); |
(seit C++23) | |
| template< class DifferenceType > constexpr /*range adaptor closure*/ chunk( DifferenceType&& n ); |
(seit C++23) | |
| Hilfsschablonen |
||
template< class I > constexpr I /*div-ceil*/( I num, I denom ); |
(4) | (nur Exposition*) |
chunk_view nimmt eine view und eine Zahl n und erzeugt einen Bereich von Views (die Chunks) der ursprünglichen View, sodass jeder Chunk, außer vielleicht dem letzten, die Größe n hat. Diese Chunks sind nicht überlappende, aufeinanderfolgende Teilbereiche der Elemente der ursprünglichen View, in Reihenfolge.
Sei s die Größe der ursprünglichen View. Wenn s kein Vielfaches von n ist, dann ist die Größe der *zuletzt* erzeugten View exakt s % n (der Rest). Andernfalls ist die Größe jedes Chunks, einschließlich des letzten, n.
Die Größe der erzeugten View ist /*div-ceil*/(s).
Wenn n nicht größer als 0 ist, ist das Verhalten undefiniert.
V unterstützt, die nur input_range modelliert.V unterstützt, die forward_range oder stärker modelliert. Modelliert common_range, wenn die zugrundeliegende View V forward_range, common_range und entweder sized_range oder nicht bidirectional_range ist.I r = num / denom; if (num % denom) ++r; return r;
Inhalt |
[edit] Datenelemente
| Mitglied | Beschreibung |
V base_ (private) |
die zugrunde liegende Ansicht ((exposition-only member object*) |
ranges::range_difference_t<V> n_ (private) |
die "Chunk-Größe" ((exposition-only member object*) |
Wenn
| |
ranges::range_difference_t<V> remainder_ (private)(bedingt vorhanden) |
die Anzahl der verbleibenden Elemente im aktuellen Chunk ((exposition-only member object*) |
non-propagating-cache<ranges::iterator_t<V>> current_ (private)(bedingt vorhanden) |
ein Objekt, das den aktuellen zugrundeliegenden Iterator cacht ((exposition-only member object*) |
[edit] Memberfunktionen
konstruiert eine chunk_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 oder Sentinel 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 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] Deduction Guides
[edit] Verschachtelte Klassen
| (C++23) |
der Ausgabe-("chunk-weise") Iteratortyp, wenn V input_range modelliert (1)((nur zur Veranschaulichung)*) |
| (C++23) |
der innere ("elementweise") Iteratortyp, wenn V input_range modelliert (1)((nur zur Veranschaulichung)*) |
| (C++23) |
der Iteratortyp, wenn V forward_range modelliert (2)((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*) |
[edit] Hilfsschablonen
| template< class V > constexpr bool ranges::enable_borrowed_range<chunk_view<V>> = |
(seit C++23) | |
Diese Spezialisierung von ranges::enable_borrowed_range lässt chunk_view borrowed_range erfüllen, wenn die zugrundeliegende View V sowohl forward_range als auch borrowed_range erfüllt.
[edit] Hinweise
Wenn V input_range modelliert (1), hat der Iterator von chunk_view einen dedizierten Typ: outer_iterator::value_type, der selbst eine Input-View ist.
Wenn V forward_range oder stärker modelliert (2), greift chunk_view für seinen value_type auf views::take zurück.
Wenn V bidirectional_range oder stärker modelliert (2), erfordert die Notwendigkeit, die Größe des letzten Chunks korrekt zu berechnen (vom Ende des Iterators), dass der zugrundeliegende Range-Typ V eine sized_range ist.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_chunk |
202202L |
(C++23) | std::ranges::chunk_view
|
[edit] Beispiel
#include <algorithm> #include <iostream> #include <ranges> auto print_subrange = [](std::ranges::viewable_range auto&& r) { std::cout << '['; for (int pos{}; auto elem : r) std::cout << (pos++ ? " " : "") << elem; std::cout << "] "; }; int main() { const auto v = {1, 2, 3, 4, 5, 6}; for (const unsigned width : std::views::iota(1U, 2U + v.size())) { auto const chunks = v | std::views::chunk(width); std::cout << "chunk(" << width << "): "; std::ranges::for_each(chunks, print_subrange); std::cout << '\n'; } }
Ausgabe
chunk(1): [1] [2] [3] [4] [5] [6] chunk(2): [1 2] [3 4] [5 6] chunk(3): [1 2 3] [4 5 6] chunk(4): [1 2 3 4] [5 6] chunk(5): [1 2 3 4 5] [6] chunk(6): [1 2 3 4 5 6] chunk(7): [1 2 3 4 5 6]
[edit] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 26.7.28 Chunk view [range.chunk]
[edit] Siehe auch
teilt die view in Teilbereiche zwischen jedem Paar benachbarter Elemente auf, für die das gegebene Prädikat false zurückgibt(Klassenschablone) (Range-Adaptor-Objekt) | |
ein view, der aus Tupeln von Referenzen auf benachbarte Elemente des adaptierten Views besteht(Klassen-Template) (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) |