Skip to content

Commit 4bf3b2a

Browse files
committed
chunk_view #1075
1 parent 9eeee30 commit 4bf3b2a

File tree

3 files changed

+157
-3
lines changed

3 files changed

+157
-3
lines changed

lang/cpp23.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ C++23とは、2023年中に改訂される予定の、C++バージョンの通
143143
- Rangeを代入する`assign_range()`メンバ関数
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)を追加
146-
- Rangeを指定の大きさで分割する[`std::views::chunk`](/reference/ranges/chunk_view.md.nolink)と、Rangeを指定の大きさの隣接要素で分割する[`std::views::slide`](/reference/ranges/slide_view.md.nolink)を追加
146+
- Rangeを指定の大きさで分割する[`std::views::chunk`](/reference/ranges/chunk_view.md)と、Rangeを指定の大きさの隣接要素で分割する[`std::views::slide`](/reference/ranges/slide_view.md.nolink)を追加
147147
- Rangeを条件一致する間の要素で分割する[`std::views::chunk_by`](/reference/ranges/chunk_by_view.md.nolink)を追加
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)を追加

reference/ranges.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,8 @@ range | adaptor(args...)
367367
368368
| 名前 | 説明 | 対応バージョン |
369369
|---------------------------------------------|--------------------------------------------------------------------|----------------|
370-
| [`chunk_view`](ranges/chunk_view.md.nolink) | シーケンスを指定個数で区切った`view`のシーケンス (class template) | C++23 |
371-
| [`views::chunk`](ranges/chunk_view.md.nolink) | `chunk_view`を生成する (customization point object) | C++23 |
370+
| [`chunk_view`](ranges/chunk_view.md) | シーケンスを指定個数で区切った`view`のシーケンス (class template) | C++23 |
371+
| [`views::chunk`](ranges/chunk_view.md) | `chunk_view`を生成する (customization point object) | C++23 |
372372
373373
### chunk by view
374374

reference/ranges/chunk_view.md

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
# chunk_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<view V>
10+
requires input_range<V>
11+
class chunk_view : public view_interface<chunk_view<V>> {…… }; // (1)
12+
13+
namespace views {
14+
inline constexpr /*unspecified*/ chunk = /*unspecified*/; // (2)
15+
}
16+
}
17+
```
18+
19+
## 概要
20+
21+
`chunk_view`はRangeを指定個数ごとに分割した[`view`](view.md)のRange。
22+
23+
元となるRangeの要素数が指定個数で割り切れない場合、最後の[`view`](view.md)は余った要素のみを持ち、その要素数は指定個数よりも少なくなる。
24+
25+
- (1): `chunk_view`のクラス定義
26+
- (2): `chunk_view`を生成するカスタマイゼーションポイントオブジェクト
27+
28+
### Rangeコンセプト
29+
30+
外側Range
31+
32+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
33+
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
34+
| | ※ | 〇 | 〇 | ※ | ※ | ※ | | ※ | ○ | ○ |
35+
36+
- ※: 元となるRangeに従う
37+
38+
内側Range
39+
40+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
41+
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
42+
| | ※ | 〇 | 〇 | ※ | ※ | ※ | ※ | ※ | ○ | ○ |
43+
44+
- ※: 元となるRangeに従う
45+
46+
## 効果
47+
48+
- (2): 式`views::chunk(E, N)`の効果は`chunk_view(E, N)`と等しい。
49+
50+
## 事前条件
51+
52+
- (2): n > 0
53+
54+
## メンバ関数
55+
56+
| 名前 | 説明 | 対応バージョン |
57+
|-----------------------------------------------------|----------------------------------|----------------|
58+
| [`(constructor)`](chunk_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
59+
| [`base`](chunk_view/base.md.nolink) | `V`の参照を取得する | C++23 |
60+
| [`begin`](chunk_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
61+
| [`end`](chunk_view/end.md.nolink) | 番兵を取得する | C++23 |
62+
| [`size`](chunk_view/size.md.nolink) | 要素数を取得する | C++23 |
63+
64+
## 継承しているメンバ関数
65+
66+
| 名前 | 説明 | 対応バージョン |
67+
|----------------------------------------------|-----------------------------------|----------------|
68+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
69+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
70+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
71+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
72+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
73+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
74+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
75+
76+
## 推論補助
77+
78+
| 名前 | 説明 | 対応バージョン |
79+
|-------------------------------------------------------|------------------------------|----------------|
80+
| [`(deduction_guide)`](chunk_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
81+
82+
## 例
83+
```cpp example
84+
#include <ranges>
85+
#include <vector>
86+
#include <print>
87+
88+
int main() {
89+
std::vector v = {1, 2, 3, 4, 5, 6};
90+
std::println("{}", v | std::views::chunk(1));
91+
std::println("{}", v | std::views::chunk(3));
92+
std::println("{}", v | std::views::chunk(5));
93+
std::println("{}", v | std::views::chunk(7));
94+
}
95+
```
96+
* std::views::chunk[color ff0000]
97+
98+
### 出力
99+
```
100+
[[1], [2], [3], [4], [5], [6]]
101+
[[1, 2, 3], [4, 5, 6]]
102+
[[1, 2, 3, 4, 5], [6]]
103+
[[1, 2, 3, 4, 5, 6]]
104+
```
105+
106+
## 例 縦横に並んだ数値を読む
107+
```cpp example
108+
#include <ranges>
109+
#include <vector>
110+
#include <string>
111+
#include <sstream>
112+
#include <print>
113+
114+
int main() {
115+
// cin代わりの文字列ストリーム
116+
std::istringstream iss(R"(
117+
2 10
118+
31 41 59 26 53 58 97 93 23 84
119+
62 64 33 83 27 95 2 88 41 97
120+
)");
121+
122+
int h, w;
123+
iss >> h >> w;
124+
125+
const auto table = std::views::istream<int>(iss)
126+
| std::views::chunk(w)
127+
| std::views::take(h)
128+
| std::ranges::to<std::vector<std::vector<int>>();
129+
130+
std::println("{}", table);
131+
}
132+
```
133+
* std::views::chunk[color ff0000]
134+
* std::views::take[link take_view.md]
135+
* std::ranges::to[link to.md]
136+
137+
### 出力
138+
```
139+
[[31, 41, 59, 26, 53, 58, 97, 93, 23, 84], [62, 64, 33, 83, 27, 95, 2, 88, 41, 97]]
140+
```
141+
142+
143+
## バージョン
144+
### 言語
145+
- C++23
146+
147+
### 処理系
148+
- [Clang](/implementation.md#clang): ??
149+
- [GCC](/implementation.md#gcc): 14.0
150+
- [ICC](/implementation.md#icc): ??
151+
- [Visual C++](/implementation.md#visual_cpp): ??
152+
153+
## 参照
154+
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)

0 commit comments

Comments
 (0)