Skip to content

Commit 9af2af3

Browse files
committed
chunk_by_view #1076
1 parent 80918ec commit 9af2af3

File tree

4 files changed

+118
-7
lines changed

4 files changed

+118
-7
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@
124124
* std::basic_istream[link /reference/istream/basic_istream.md]
125125
* <iterator>[link /reference/iterator.md]
126126
* default_sentinel_t[link /reference/iterator/default_sentinel_t.md]
127+
* indirect_binary_predicate[link /reference/iterator/indirect_binary_predicate.md]
128+
* indirect_unary_predicate[link /reference/iterator/indirect_unary_predicate.md]
127129
* std::back_inserter[link /reference/iterator/back_inserter.md]
128130
* std::begin[link /reference/iterator/begin.md]
129131
* std::distance[link /reference/iterator/distance.md]

lang/cpp23.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ C++23とは、2023年中に改訂される予定の、C++バージョンの通
144144
- ユーザー定義のRangeアダプタがパイプライン演算子 `|` をサポートしやすくするために、[`<ranges>`](/reference/ranges.md)[`std::ranges::range_adaptor_closure`](/reference/ranges/range_adaptor_closure.md.nolink)クラスを追加
145145
- [`<ranges>`](/reference/ranges.md)に、Rangeを連結させる[`join_with`](/reference/ranges/join_with_view.md)を追加
146146
- Rangeを指定の大きさで分割する[`std::views::chunk`](/reference/ranges/chunk_view.md)と、Rangeを指定の大きさの隣接要素で分割する[`std::views::slide`](/reference/ranges/slide_view.md)を追加
147-
- Rangeを条件一致する間の要素で分割する[`std::views::chunk_by`](/reference/ranges/chunk_by_view.md.nolink)を追加
147+
- Rangeを条件一致する間の要素で分割する[`std::views::chunk_by`](/reference/ranges/chunk_by_view.md)を追加
148148
- [`<ranges>`](/reference/ranges.md)に、Rangeを等間隔からなるRangeに変換する[`std::views::stride`](/reference/ranges/stride_view.md.nolink)を追加
149149
- [`<ranges>`](/reference/ranges.md)に、Rangeをムーブするための[`std::views::as_rvalue`](/reference/ranges/as_rvalue_view.md)を追加
150150
- [`<ranges>`](/reference/ranges.md)に、指定した値をN回繰り返すRangeを生成する[`std::views::repeat`](/reference/ranges/repeat_view.md)を追加

reference/ranges.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -365,17 +365,17 @@ range | adaptor(args...)
365365
366366
### chunk view
367367
368-
| 名前 | 説明 | 対応バージョン |
369-
|---------------------------------------------|--------------------------------------------------------------------|----------------|
368+
| 名前 | 説明 | 対応バージョン |
369+
|----------------------------------------------|--------------------------------------------------------------------|----------------|
370370
| [`chunk_view`](ranges/chunk_view.md) | シーケンスを指定個数で区切った`view`のシーケンス (class template) | C++23 |
371371
| [`views::chunk`](ranges/chunk_view.md) | `chunk_view`を生成する (customization point object) | C++23 |
372372
373373
### chunk by view
374374
375-
| 名前 | 説明 | 対応バージョン |
376-
|---------------------------------------------|--------------------------------------------------------------------|----------------|
377-
| [`chunk_by_view`](ranges/chunk_by_view.md.nolink) | 2項述語が偽となる部分で区切った`view`のシーケンス (class template) | C++23 |
378-
| [`views::chunk_by`](ranges/chunk_by_view.md.nolink) | `chunk_by_view`を生成する (customization point object) | C++23 |
375+
| 名前 | 説明 | 対応バージョン |
376+
|----------------------------------------------|--------------------------------------------------------------------|----------------|
377+
| [`chunk_by_view`](ranges/chunk_by_view.md) | 2項述語が偽となる部分で区切った`view`のシーケンス (class template) | C++23 |
378+
| [`views::chunk_by`](ranges/chunk_by_view.md) | `chunk_by_view`を生成する (customization point object) | C++23 |
379379
380380
### slide view
381381

reference/ranges/chunk_by_view.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# chunk_by_view
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* class template[meta id-type]
5+
* cpp23[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred>
10+
requires view<V> && is_object_v<Pred>
11+
class chunk_by_view : public view_interface<chunk_by_view<V, Pred>> {…… }; // (1)
12+
13+
namespace views {
14+
inline constexpr /*unspecified*/ chunk_by = /*unspecified*/; // (2)
15+
}
16+
}
17+
```
18+
19+
## 概要
20+
21+
`chunk_by_view`はRangeを指定した二項述語が偽となる場所で分割した[`view`](view.md)のRange。
22+
23+
- (1): `chunk_by_view`のクラス定義
24+
- (2): `chunk_by_view`を生成するカスタマイゼーションポイントオブジェクト
25+
26+
### Rangeコンセプト
27+
28+
外側Range
29+
30+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
31+
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
32+
| | | 〇 | 〇 | ※ | ※ | | | | ○ | ○ |
33+
34+
- ※: 元となるRangeに従う
35+
36+
内側Range
37+
38+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
39+
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
40+
| | ※ | 〇 | 〇 | ※ | ※ | ※ | ※ | ※ | ○ | ○ |
41+
42+
- ※: 元となるRangeに従う
43+
44+
## 効果
45+
46+
- (2): 式`views::chunk_by(E, F)`の効果は`chunk_by_view(E, F)`と等しい。
47+
48+
## メンバ関数
49+
50+
| 名前 | 説明 | 対応バージョン |
51+
|-----------------------------------------------------|----------------------------------|----------------|
52+
| [`(constructor)`](chunk_by_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
53+
| [`base`](chunk_by_view/base.md.nolink) | `V`の参照を取得する | C++23 |
54+
| [`pred`](chunk_by_view/pred.md.nolink) | 述語を取得する | C++23 |
55+
| [`begin`](chunk_by_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
56+
| [`end`](chunk_by_view/end.md.nolink) | 番兵を取得する | C++23 |
57+
58+
## 継承しているメンバ関数
59+
60+
| 名前 | 説明 | 対応バージョン |
61+
|----------------------------------------------|-----------------------------------|----------------|
62+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
63+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
64+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
65+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
66+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
67+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
68+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
69+
70+
## 推論補助
71+
72+
| 名前 | 説明 | 対応バージョン |
73+
|-------------------------------------------------------|------------------------------|----------------|
74+
| [`(deduction_guide)`](chunk_by_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
75+
76+
## 例
77+
```cpp example
78+
#include <ranges>
79+
#include <vector>
80+
#include <functional>
81+
#include <print>
82+
83+
int main() {
84+
std::vector v = {1, 2, 2, 3, 0, 4, 5, 2};
85+
// 列が転倒する場所で分割
86+
std::println("{}", v | std::views::chunk_by(std::ranges::less_equal{}));
87+
}
88+
```
89+
* std::views::chunk_by[color ff0000]
90+
* std::ranges::less_equal[link /reference/functional/functional.md]
91+
* 転倒[link https://ja.wikipedia.org/wiki/%E8%BB%A2%E5%80%92_(%E6%95%B0%E5%AD%A6)]
92+
93+
### 出力
94+
```
95+
[[1, 2, 2, 3], [0, 4, 5], [2]]
96+
```
97+
98+
## バージョン
99+
### 言語
100+
- C++23
101+
102+
### 処理系
103+
- [Clang](/implementation.md#clang): ??
104+
- [GCC](/implementation.md#gcc): 14.0
105+
- [ICC](/implementation.md#icc): ??
106+
- [Visual C++](/implementation.md#visual_cpp): ??
107+
108+
## 参照
109+
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)

0 commit comments

Comments
 (0)