Skip to content

Commit 5695a7a

Browse files
committed
adjacent_transform_view #1063
1 parent de6c390 commit 5695a7a

File tree

4 files changed

+119
-6
lines changed

4 files changed

+119
-6
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@
7474
* <concepts>[link /reference/concepts.md]
7575
* common_reference_with[link /reference/concepts/common_reference_with.md]
7676
* common_with[link /reference/concepts/common_with.md]
77+
* copy_constructible[link /reference/concepts/copy_constructible.md]
7778
* invocable[link /reference/concepts/invocable.md]
79+
* move_constructible[link /reference/concepts/move_constructible.md]
7880
* regular_invocable[link /reference/concepts/invocable.md]
7981
* same_as[link /reference/concepts/same_as.md]
8082
* <condition_variable>[link /reference/condition_variable.md]

reference/ranges.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,8 @@ range | adaptor(args...)
360360
361361
| 名前 | 説明 | 対応バージョン |
362362
|------------------------------------------------------------------|------------------------------------------------------------------------------------|----------------|
363-
| [`adjacent_transform_view`](ranges/adjacent_transform_view.md.nolink) | `adjacent_view`と同様に取り出し、関数を適用した結果のビュー (class template) | C++23 |
364-
| [`views::adjacent_transform`](ranges/adjacent_transform_view.md.nolink) | `adjacent_transform_view`を生成する (customization point object) | C++23 |
363+
| [`adjacent_transform_view`](ranges/adjacent_transform_view.md) | `adjacent_view`と同様に取り出し、関数を適用した結果のビュー (class template) | C++23 |
364+
| [`views::adjacent_transform`](ranges/adjacent_transform_view.md) | `adjacent_transform_view`を生成する (customization point object) | C++23 |
365365
366366
### chunk view
367367
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# adjacent_transform_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, move_constructible F, size_t N>
10+
requires view<V> && (N > 0) && is_object_v<F> &&
11+
regular_invocable<F&, REPEAT(range_reference_t<V>, N)...> &&
12+
can-reference<invoke_result_t<F&, REPEAT(range_reference_t<V>, N)...>>
13+
class adjacent_transform_view : public view_interface<adjacent_transform_view<V, F, N>> { …… }; // (1)
14+
15+
namespace views {
16+
inline constexpr /*unspecified*/ adjacent_transform_view = /*unspecified*/; // (2)
17+
}
18+
}
19+
```
20+
* REPEAT[italic]
21+
* can-reference[link /reference/iterator/dereferenceable.md]
22+
23+
## 概要
24+
25+
`adjacent_transform_view`は各要素とそれに隣接する要素を指定個数ずつ取り出し、それらを引数として関数を呼び出した結果を要素とする[`view`](view.md)。
26+
27+
`adjacent_transform_view`の要素を1つ取得するごとに、`V` の要素を `N` 個取得する。
28+
29+
`N` が元となるRangeの要素数より大きい場合、この[`view`](view.md)は空である。
30+
31+
- (1): `adjacent_transform_view`のクラス定義
32+
- (2): `adjacent_transform_view`を生成するカスタマイゼーションポイントオブジェクト
33+
34+
35+
### Rangeコンセプト
36+
37+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
38+
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
39+
| | (1) | 〇 | 〇 | (1) | (1) | (1) | | (1) | ○ | ○ |
40+
41+
- (1): [`adjacent_view`](adjacent_view.md)`<V, N>`に従う
42+
43+
## 効果
44+
45+
- (2): 式 `views::adjacent_transform<N>(E, F)` の効果は以下の通り。
46+
- `N` > 0 のとき、`adjacent_transform_view<`[`views::all_t`](all.md)`<decltype((E))>, `[`decay_t`](/reference/type_traits/decay.md)`<decltype((F))>, N>(E, F)` と等しい
47+
- `N` = 0 のとき、`((void)E, `[`views::zip_transform`](zip_transform_view.md)`(F))` と等しい(ただし`E`と`F`の評価順は不定)
48+
49+
## 備考
50+
51+
`REPEAT(T, N)` をT型のN個のパックとする。
52+
53+
## メンバ関数
54+
55+
| 名前 | 説明 | 対応バージョン |
56+
|--------------------------------------------------|----------------------------------|----------------|
57+
| [`(constructor)`](adjacent_transform_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
58+
| [`base`](adjacent_transform_view/base.md.nolink) | `V`の参照を取得する | C++23 |
59+
| [`begin`](adjacent_transform_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
60+
| [`end`](adjacent_transform_view/end.md.nolink) | 番兵を取得する | C++23 |
61+
| [`size`](adjacent_transform_view/size.md.nolink) | 要素数を取得する | C++23 |
62+
63+
## 継承しているメンバ関数
64+
65+
| 名前 | 説明 | 対応バージョン |
66+
|----------------------------------------------|-----------------------------------|----------------|
67+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
68+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
69+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
70+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
71+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
72+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
73+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
74+
75+
## 推論補助
76+
77+
| 名前 | 説明 | 対応バージョン |
78+
|-------------------------------------------------------|------------------------------|----------------|
79+
| [`(deduction_guide)`](adjacent_transform_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
80+
81+
## 例
82+
```cpp example
83+
int main() {
84+
// 隣接する要素間の差を計算する
85+
std::vector v = {9, 2, 5, 3, 6, 7};
86+
std::println("{}", v | std::views::adjacent_transform_view<2>([](auto x, auto y) { return y - x; }));
87+
}
88+
```
89+
* std::views::adjacent_transform_view[color ff0000]
90+
91+
### 出力
92+
```
93+
[-7, 3, -2, 3, 1]
94+
```
95+
96+
97+
## バージョン
98+
### 言語
99+
- C++23
100+
101+
### 処理系
102+
- [Clang](/implementation.md#clang): ??
103+
- [GCC](/implementation.md#gcc): ??
104+
- [ICC](/implementation.md#icc): ??
105+
- [Visual C++](/implementation.md#visual_cpp): ??
106+
107+
## 関連項目
108+
- [`adjacent_difference`](/reference/numeric/adjacent_difference.md) 隣接する2つの要素間の差を計算するアルゴリズム関数
109+
110+
## 参照
111+
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)

reference/ranges/adjacent_view.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace std::ranges {
2525
`N` が元となるRangeの要素数より大きい場合、この[`view`](view.md)は空である。
2626
2727
- (1): `adjacent_view`のクラス定義
28-
- (2): `adjacent_view`を生成するカスタマイゼーションポイントオブジェクト(Rangeアダプタオブジェクトではない)
28+
- (2): `adjacent_view`を生成するカスタマイゼーションポイントオブジェクト
2929
3030
### Rangeコンセプト
3131
@@ -47,10 +47,10 @@ namespace std::ranges {
4747
| 名前 | 説明 | 対応バージョン |
4848
|-----------------------------------------------------|----------------------------------|----------------|
4949
| [`(constructor)`](adjacent_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
50-
| [`base`](take_view/base.md.nolink) | `V`の参照を取得する | C++23 |
50+
| [`base`](adjacent_view/base.md.nolink) | `V`の参照を取得する | C++23 |
5151
| [`begin`](adjacent_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
5252
| [`end`](adjacent_view/end.md.nolink) | 番兵を取得する | C++23 |
53-
| [`size`](take_view/size.md.nolink) | 要素数を取得する | C++23 |
53+
| [`size`](adjacent_view/size.md.nolink) | 要素数を取得する | C++23 |
5454
5555
## 継承しているメンバ関数
5656
@@ -107,7 +107,7 @@ int main() {
107107
- [Visual C++](/implementation.md#visual_cpp): ??
108108

109109
## 関連項目
110-
- [`adjacent_transform_view`](adjacent_transform_view.md.nolink) `adjacent_view` と同じように要素を取得して関数を適用する
110+
- [`adjacent_transform_view`](adjacent_transform_view.md) `adjacent_view` と同じように要素を取得して関数を適用する
111111

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

0 commit comments

Comments
 (0)