std::ranges::views::chunk, std::ranges::chunk_view
| Definiert in Header <ranges>
|
||
template< ranges::view V >
requires ranges::input_range<V>
class chunk_view
: public ranges::view_interface<chunk_view<V>>
|
(1) | (seit C++23) |
template< ranges::view V >
requires ranges::forward_range<V>
class chunk_view<V>
: public ranges::view_interface<chunk_view<V>>
|
(2) | (seit C++23) |
namespace views {
inline constexpr /* unspecified */ chunk = /* unspecified */;
}
|
(3) | (seit C++23) |
| Aufrufsignatur |
||
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) | |
| Hilfsvorlagen |
||
template< class I >
constexpr I /*div-ceil*/( I num, I denom );
|
(4) | (nur zur Darstellung*) |
chunk_view nimmt eine view und eine Zahl n und erzeugt einen Bereich von Ansichten (den Blöcken ) der ursprünglichen Ansicht, sodass jeder Block , außer möglicherweise der letzte, die Größe n hat. Diese Blöcke sind nicht überlappende, aufeinanderfolgende Teilbereiche der Elemente der ursprünglichen Ansicht in Reihenfolge.
Sei s die Größe der ursprünglichen Ansicht. Wenn s kein Vielfaches von n ist, ist die Größe der letzten erzeugten Ansicht genau s % n (der Rest). Andernfalls ist die Größe jedes Blocks , einschließlich des letzten, n.
Die Größe der erzeugten Ansicht 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 zugrunde liegende Ansicht V forward_range, common_range ist und entweder sized_range oder nicht bidirectional_range ist.views::chunk bezeichnet ein RangeAdaptorObject. Gegeben seien Unterausdrücke e und n, der Ausdruck views::chunk(e, n) ist ausdrucksäquivalent zu chunk_view(e, n).num durch denom ist. Äquivalent zu:
I r = num / denom;
if (num % denom)
++r;
return r;
Datenmitglieder
| Member | Beschreibung |
V
base_
|
die zugrundeliegende Ansicht
( Nur zur Darstellung verwendetes Mitgliedsobjekt* ) |
ranges::
range_difference_t
<
V
>
n_
|
die "Chunk"-Größe
( Nur zur Darstellung verwendetes Mitgliedsobjekt* ) |
Wenn
|
|
ranges::
range_difference_t
<
V
>
remainder_
(bedingt vorhanden) |
die Anzahl der im aktuellen "Chunk" verbleibenden Elemente
( Nur-Darstellungs-Memberobjekt* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(bedingt vorhanden) |
ein Objekt, das den aktuellen zugrundeliegenden Iterator zwischenspeichert
( Nur-Darstellungs-Memberobjekt* ) |
Memberfunktionen
konstruiert einen
chunk_view
(öffentliche Elementfunktion) |
|
|
gibt eine Kopie der zugrundeliegenden (adaptierten) Ansicht zurück
(öffentliche Elementfunktion) |
|
|
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion) |
|
|
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Elementfunktion) |
|
gibt die Anzahl der Elemente zurück, bereitgestellt nur wenn der zugrundeliegende (adaptierte) Bereich
sized_range
erfüllt
(öffentliche Elementfunktion) |
|
|
(C++26)
|
gibt die ungefähre Größe des resultierenden
approximately_sized_range
zurück
(öffentliche Elementfunktion) |
Geerbt von ranges::view_interface | |
| gibt zurück, ob die abgeleitete Ansicht leer ist, nur wenn sie sized_range oder forward_range erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
| |
(C++23) |
gibt einen konstanten Iterator zum Anfang des Bereichs zurück (öffentliche Elementfunktion von std::ranges::view_interface<D>)
|
(C++23) |
gibt einen Sentinel für den konstanten Iterator des Bereichs zurück (öffentliche Elementfunktion von std::ranges::view_interface<D>)
|
| gibt zurück, ob die abgeleitete Ansicht nicht leer ist, nur wenn ranges::empty darauf anwendbar ist (öffentliche Elementfunktion von std::ranges::view_interface<D>)
| |
| gibt das erste Element in der abgeleiteten Ansicht zurück, sofern sie forward_range erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
| |
| gibt das letzte Element in der abgeleiteten Ansicht zurück, nur wenn sie bidirectional_range und common_range erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
| |
gibt das nte Element in der abgeleiteten Ansicht zurück, nur wenn sie random_access_range erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
| |
Deduktionshilfen
Geschachtelte Klassen
|
(C++23)
|
der Ausgabe-("chunk-weise") Iteratortyp, wenn
V
input_range
modelliert
(
1
)
( Nur zur Darstellung verwendete Memberklasse* ) |
|
(C++23)
|
der innere ("element-weise") Iteratortyp, wenn
V
input_range
modelliert
(
1
)
( Nur zur Darstellung verwendete Memberklasse* ) |
|
(C++23)
|
der Iteratortyp, wenn
V
forward_range
modelliert
(
2
)
( Nur zur Darstellung verwendete Memberklassenvorlage* ) |
Hilfsvorlagen
|
template
<
class
V
>
constexpr
bool
ranges::
enable_borrowed_range
<
chunk_view
<
V
>>
=
|
(seit C++23) | |
Diese Spezialisierung von
ranges::enable_borrowed_range
bewirkt, dass
chunk_view
die Anforderungen von
borrowed_range
erfüllt, wenn die zugrundeliegende View
V
sowohl
forward_range
als auch
borrowed_range
erfüllt.
Hinweise
Wenn
V
ein
input_range
(
1
)
modelliert, dann hat der Iterator von
chunk_view
einen speziellen Typ:
outer_iterator::value_type
, der selbst eine Eingabeansicht ist.
Wenn
V
ein
forward_range
oder stärker modelliert
(
2
)
,
delegiert
chunk_view
an
views::take
für seinen
value_type
.
Wenn
V
bidirectional_range
oder stärkere Ranges modelliert
(
2
)
, erfordert die Notwendigkeit, die Größe des letzten Chunks korrekt zu berechnen (vom Ende-
Iterator
), dass der zugrundeliegende Range-Typ
V
ein
sized_range
ist.
| Feature-Test Makro | Wert | Standard | Funktion |
|---|---|---|---|
__cpp_lib_ranges_chunk
|
202202L
|
(C++23) |
std::ranges::chunk_view
|
Beispiel
#include <algorithm> #include <initializer_list> #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]
Referenzen
- C++23-Standard (ISO/IEC 14882:2024):
-
- 26.7.28 Chunk-Ansicht [range.chunk]
Siehe auch
teilt die
view
in Subbereiche zwischen jedem Paar benachbarter Elemente auf, für die das gegebene Prädikat
false
zurückgibt
(Klassentemplate) (Range-Adapter-Objekt) |
|
eine
view
bestehend aus Tupeln von Referenzen auf benachbarte Elemente der adaptierten View
(Klassentemplate) (Range-Adapter-Objekt) |
|
|
(C++23)
|
eine
view
deren M
tes
Element eine
view
über das M
te
bis (M + N - 1)
te
Element einer anderen
view
ist
(Klassentemplate) (Range-Adapter-Objekt) |