Namensräume
Varianten
Aktionen

std::ranges::views::chunk, std::ranges::chunk_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
std::ranges::chunk_view
Memberfunktionen
Klassen für input_ranges
Deduction Guides
outer-iterator
outer-iterator::value_type
inner-iterator
 
Definiert in der Header-Datei <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)
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.

1) Eine Implementierung, die die zugrundeliegende View V unterstützt, die nur input_range modelliert.
2) Eine partielle Spezialisierung, die die zugrundeliegende View 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.
3) Der Name views::chunk bezeichnet ein RangeAdaptorObject. Gegeben sind die Teilausdrücke e und n, der Ausdruck views::chunk(e, n) ist ausdrucksäquivalent zu chunk_view(e, n).
4) Berechnet den kleinsten ganzzahligen Wert, der nicht kleiner ist als der Quotient der Division von num durch denom. Entspricht
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 V genau input_range modelliert (1)
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) [edit]
gibt eine Kopie der zugrunde liegenden (angepassten) View zurück
(public member function) [edit]
gibt einen Iterator zum Anfang zurück
(öffentliche Member-Funktion) [edit]
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Member-Funktion) [edit]
gibt die Anzahl der Elemente zurück, nur bereitgestellt, wenn die zugrunde liegende (adaptierte) Range sized_range erfüllt
(öffentliche Member-Funktion) [edit]
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>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
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>) [edit]
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>) [edit]
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]
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]

[edit] Deduction Guides

[edit] Verschachtelte Klassen

der Ausgabe-("chunk-weise") Iteratortyp, wenn V input_range modelliert (1)
((nur zur Veranschaulichung)*)
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>> =

    ranges::forward_range<V> && ranges::enable_borrowed_range<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)[bearbeiten]
ein view, der aus Tupeln von Referenzen auf benachbarte Elemente des adaptierten Views besteht
(Klassen-Template) (Range-Adaptor-Objekt)[edit]
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)[bearbeiten]