Namensräume
Varianten
Aktionen

std::ranges::views::chunk_by, std::ranges::chunk_by_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in der Header-Datei <ranges>
template< ranges::forward_range V, std::indirect_binary_predicate<iterator_t<V>,

          ranges::iterator_t<V>> Pred >
    requires ranges::view<V> && std::is_object_v<Pred>
class chunk_by_view

    : public ranges::view_interface<chunk_by_view<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 */

constexpr ranges::view auto chunk_by( R&& r, Pred&& pred );
(seit C++23)
template< class Pred >
constexpr /*range adaptor closure*/ chunk_by( Pred&& pred );
(seit C++23)
1) 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.
2) Der Name views::chunk_by bezeichnet ein RangeAdaptorObject. Für einen Unterausdruck e und f ist der Ausdruck views::chunk_by(e, f) ausdrucksäquivalent zu chunk_by_view(e, f).

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) [edit]
gibt eine Kopie der zugrunde liegenden (angepassten) View zurück
(public member function) [edit]
gibt eine Referenz auf die gespeicherte Prädikatfunktion 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 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>) [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]

[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)[bearbeiten]
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]
eine view, die aus Elementen einer anderen view besteht und dabei jeweils N Elemente überspringt
(Klassenschablone) (Range-Adaptor-Objekt)[bearbeiten]