Skip to content

Commit 80918ec

Browse files
committed
slide_view #1075
1 parent 4bf3b2a commit 80918ec

File tree

5 files changed

+127
-6
lines changed

5 files changed

+127
-6
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)と、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)を追加
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
@@ -381,8 +381,8 @@ range | adaptor(args...)
381381
382382
| 名前 | 説明 | 対応バージョン |
383383
|----------------------------------------|---------------------------------------------------------------------------------|----------------|
384-
| [`slide_view`](ranges/slide_view.md.nolink) | 各要素とそれに隣接する要素を指定個数ずつ見る`view`のシーケンス (class template) | C++23 |
385-
| [`views::slide`](ranges/slide_view.md.nolink) | `slide_view`を生成する (customization point object) | C++23 |
384+
| [`slide_view`](ranges/slide_view.md) | 各要素とそれに隣接する要素を指定個数ずつ見る`view`のシーケンス (class template) | C++23 |
385+
| [`views::slide`](ranges/slide_view.md) | `slide_view`を生成する (customization point object) | C++23 |
386386
387387
### stride view
388388

reference/ranges/adjacent_transform_view.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace std::ranges {
2222
2323
## 概要
2424
25-
`adjacent_transform_view`は各要素とそれに隣接する要素を指定個数ずつ取り出し、それらを引数として関数を呼び出した結果を要素とする[`view`](view.md)。
25+
`adjacent_transform_view`は各要素とそれに隣接する要素をコンパイル時指定の個数ずつ取り出し、それらを引数として関数を呼び出した結果を要素とする[`view`](view.md)。
2626
2727
`adjacent_transform_view`の要素を1つ取得するごとに、`V` の要素を `N` 個取得する。
2828

reference/ranges/adjacent_view.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace std::ranges {
1818
1919
## 概要
2020
21-
`adjacent_view`は各要素とそれに隣接する要素を指定個数ずつ取り出した[`tuple`](/reference/tuple/tuple.md)を要素とする[`view`](view.md)。
21+
`adjacent_view`は各要素とそれに隣接する要素をコンパイル時指定の個数ずつ取り出した[`tuple`](/reference/tuple/tuple.md)を要素とする[`view`](view.md)。
2222
2323
`adjacent_view`の要素を1つ取得するごとに、`V` の要素を `N` 個取得する。
2424
@@ -107,7 +107,8 @@ int main() {
107107
- [Visual C++](/implementation.md#visual_cpp): ??
108108

109109
## 関連項目
110-
- [`adjacent_transform_view`](adjacent_transform_view.md) `adjacent_view` と同じように要素を取得して関数を適用する
110+
- [`adjacent_transform_view`](adjacent_transform_view.md): `adjacent_view` と同じように要素を取得して関数を適用する
111+
- [`slide_view`](slide_view.md): `adjacent_view` と同じように要素を取得するが、個数を実行時に指定する。内側は[`tuple`](/reference/tuple/tuple.md)ではなく[`view`](view.md)となる
111112

112113
## 参照
113114
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)

reference/ranges/slide_view.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# slide_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 slide_view : public view_interface<slide_view<V>> {…… }; // (1)
12+
13+
namespace views {
14+
inline constexpr /*unspecified*/ slide = /*unspecified*/; // (2)
15+
}
16+
}
17+
```
18+
19+
## 概要
20+
21+
`slide_view`は各要素とそれに隣接する要素を実行時指定の個数ずつ参照する[`view`](view.md)のRange。
22+
23+
指定した個数が元となるRangeの要素数より大きい場合、この[`view`](view.md)は空である。
24+
25+
- (1): `slide_view`のクラス定義
26+
- (2): `slide_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::slide(E, N)`の効果は`slide_view(E, N)`と等しい。
49+
50+
## 事前条件
51+
52+
- (2): n > 0
53+
54+
## メンバ関数
55+
56+
| 名前 | 説明 | 対応バージョン |
57+
|-----------------------------------------------------|----------------------------------|----------------|
58+
| [`(constructor)`](slide_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
59+
| [`base`](slide_view/base.md.nolink) | `V`の参照を取得する | C++23 |
60+
| [`begin`](slide_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
61+
| [`end`](slide_view/end.md.nolink) | 番兵を取得する | C++23 |
62+
| [`size`](slide_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)`](slide_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::slide<1>);
91+
std::println("{}", v | std::views::slide<3>);
92+
std::println("{}", v | std::views::slide<6>);
93+
std::println("{}", v | std::views::slide<7>);
94+
}
95+
```
96+
* std::views::slide[color ff0000]
97+
98+
### 出力
99+
```
100+
[[1], [2], [3], [4], [5], [6]]
101+
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
102+
[[1, 2, 3, 4, 5, 6]]
103+
[]
104+
```
105+
106+
## バージョン
107+
### 言語
108+
- C++23
109+
110+
### 処理系
111+
- [Clang](/implementation.md#clang): ??
112+
- [GCC](/implementation.md#gcc): 14.0
113+
- [ICC](/implementation.md#icc): ??
114+
- [Visual C++](/implementation.md#visual_cpp): ??
115+
116+
## 関連項目
117+
- [`adjacent_view`](adjacent_view.md): `slide_view` と同じように要素を取得するが、個数をコンパイル時に指定する。内側はRangeではなく[`tuple`](/reference/tuple/tuple.md)となる
118+
119+
## 参照
120+
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)

0 commit comments

Comments
 (0)