名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
定義於標頭檔案 <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) (C++23 起)
namespace views {

    inline constexpr /* unspecified */ chunk_by = /* unspecified */ ;

}
(2) (C++23 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R, class Pred >

    requires /* 見下文 */

constexpr ranges::view auto chunk_by( R&& r, Pred&& pred );
(C++23 起)
template< class Pred >
constexpr /*range adaptor closure*/ chunk_by( Pred&& pred );
(C++23 起)
1) chunk_by_view 是一個範圍介面卡,它接受一個 view 和一個可呼叫物件 pred(二元謂詞),並生成一個子範圍(塊)的 view,透過在每對相鄰元素之間分割底層檢視,其中 pred 返回 false。每對中的第一個元素屬於前一個塊,第二個元素屬於下一個塊。
2) 名稱 views::chunk_by 表示一個 RangeAdaptorObject。給定子表示式 ef,表示式 views::chunk_by(e, f) 表示式等價chunk_by_view(e, f)

chunk_by_view 總是模型 forward_range,並且如果適配的 view 型別模型相應的概念,則模型 bidirectional_range 和/或 common_rangechunk_by_view 從不模型 borrowed_rangesized_range

目錄

[編輯] 資料成員

成員 定義
V base_ 底層 view
(僅用於闡釋的成員物件*)
movable-box<Pred> pred_ 一個物件,它封裝用於分割 base_ 元素的謂詞
(僅用於闡釋的成員物件*)
non-propagating-cache<iterator> begin_ 一個快取第一個元素的迭代器的物件
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 chunk_by_view
(public 成員函式) [編輯]
返回底層(適配)檢視的副本
(public 成員函式) [編輯]
返回對儲存的謂詞的引用
(public 成員函式) [編輯]
返回指向起始的迭代器
(public 成員函式) [編輯]
返回一個迭代器或一個哨兵到末尾
(public 成員函式) [編輯]
返回下一個子範圍開頭的迭代器
(僅用於說明的成員函式*)
返回前一個子範圍開頭的迭代器
(僅用於說明的成員函式*)
繼承自 std::ranges::view_interface
返回派生檢視是否為空,僅在它滿足 sized_rangeforward_range 時提供
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
返回派生檢視中的最後一個元素,僅在它滿足 bidirectional_rangecommon_range 時提供
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]

[編輯] 推導指南

[編輯] 巢狀類

迭代器型別
(僅用於說明的成員類模板*)

[編輯] 註解

為了提供 range 概念所要求的攤銷常數時間複雜度,begin() 的結果會被快取在 chunk_by_view 物件中。如果在首次呼叫 begin() 後底層範圍被修改,則後續使用 chunk_by_view 物件可能會導致非直觀的行為。

特性測試 標準 特性
__cpp_lib_ranges_chunk_by 202202L (C++23) std::ranges::chunk_by_view

[編輯] 示例

#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, "");
}

輸出

[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] [ß] [水] [🍌]

[編輯] 參考文獻

  • C++23 標準 (ISO/IEC 14882:2024)
  • 26.7.30 按塊檢視 [range.chunk.by]

[編輯] 另請參閱

一個 view 的範圍,它是另一個 view 元素的 N 大小的非重疊連續塊
(類模板) (範圍介面卡物件)[編輯]
一個 view,其第 M 個元素是另一個 view 的第 M 到第 (M + N - 1) 個元素的 view
(類模板) (範圍介面卡物件)[編輯]
一個 view,由另一個 view 的元素組成,每次前進 N 個元素
(類模板) (範圍介面卡物件)[編輯]