Skip to content

Commit 03cf02b

Browse files
committed
adjacent_transform_view : メンバ関数を追加 #713
1 parent 30c8531 commit 03cf02b

File tree

7 files changed

+453
-18
lines changed

7 files changed

+453
-18
lines changed

reference/ranges/adjacent_transform_view.md

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,43 +54,54 @@ namespace std::ranges {
5454
5555
| 名前 | 説明 | 対応バージョン |
5656
|--------------------------------------------------|----------------------------------|----------------|
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 |
57+
| [`(constructor)`](adjacent_transform_view/op_constructor.md) | コンストラクタ | C++23 |
58+
| [`base`](adjacent_transform_view/base.md) | `V`の参照を取得する | C++23 |
59+
| [`begin`](adjacent_transform_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
60+
| [`end`](adjacent_transform_view/end.md) | 番兵を取得する | C++23 |
61+
| [`size`](adjacent_transform_view/size.md) | 要素数を取得する | C++23 |
6262
6363
## 継承しているメンバ関数
6464
6565
| 名前 | 説明 | 対応バージョン |
6666
|----------------------------------------------|-----------------------------------|----------------|
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 |
67+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++23 |
68+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++23 |
69+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++23 |
70+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++23 |
7171
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
7272
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
73-
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
73+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++23 |
7474
7575
## 推論補助
7676
7777
| 名前 | 説明 | 対応バージョン |
7878
|-------------------------------------------------------|------------------------------|----------------|
79-
| [`(deduction_guide)`](adjacent_transform_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
79+
| [`(deduction_guide)`](adjacent_transform_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
8080
8181
## 例
8282
```cpp example
83+
#include <iostream>
84+
#include <vector>
85+
#include <ranges>
86+
8387
int main() {
8488
// 隣接する要素間の差を計算する
8589
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; }));
90+
for (int x : v | std::views::adjacent_transform_view<2>(
91+
[](auto x, auto y) { return y - x; })) {
92+
std::cout << x << std::endl;
93+
}
8794
}
8895
```
8996
* std::views::adjacent_transform_view[color ff0000]
9097

9198
### 出力
9299
```
93-
[-7, 3, -2, 3, 1]
100+
-7
101+
3
102+
-2
103+
3
104+
1
94105
```
95106

96107

@@ -99,13 +110,15 @@ int main() {
99110
- C++23
100111

101112
### 処理系
102-
- [Clang](/implementation.md#clang): ??
103-
- [GCC](/implementation.md#gcc): ??
104-
- [ICC](/implementation.md#icc): ??
105-
- [Visual C++](/implementation.md#visual_cpp): ??
113+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
114+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
115+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
106116

107117
## 関連項目
108-
- [`adjacent_difference`](/reference/numeric/adjacent_difference.md) 隣接する2つの要素間の差を計算するアルゴリズム関数
118+
- [`std::adjacent_difference`](/reference/numeric/adjacent_difference.md)
119+
- 隣接する2つの要素間の差を計算するアルゴリズム関数
120+
109121

110122
## 参照
111123
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)
124+
- [P2321R2 zip](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2321r2.html)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* adjacent_transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const &
10+
requires copy_constructible<V>; // (1) C++23
11+
12+
constexpr V base() &&; // (2) C++23
13+
```
14+
15+
## 概要
16+
17+
メンバ変数として保持している、元のviewを取得する。
18+
19+
## 効果
20+
21+
- (1) : `return inner_.base();`
22+
- (2) : `return std::move(inner_).base();`
23+
24+
ここで、`inner_``adjacent_view<V, N>`型のメンバ変数。
25+
26+
##
27+
```cpp example
28+
#include <ranges>
29+
#include <vector>
30+
#include <concepts>
31+
#include <iostream>
32+
33+
int main() {
34+
std::vector<int> v = {1, 2, 3, 4, 5};
35+
36+
auto diff = [](int x, int y) { return y - x; };
37+
std::ranges::adjacent_transform_view<std::views::all_t<std::vector<int>&>, decltype(diff), 2> atv(v, diff);
38+
39+
// (1) コピーして取得
40+
auto base1 = atv.base();
41+
static_assert(std::same_as<decltype(base1), std::ranges::ref_view<std::vector<int>>>);
42+
43+
// (2) ムーブして取得
44+
auto base2 = std::move(atv).base();
45+
static_assert(std::same_as<decltype(base2), std::ranges::ref_view<std::vector<int>>>);
46+
47+
// 取得したviewを使用(元の要素を表示)
48+
for (int n : base1) {
49+
std::cout << n << " ";
50+
}
51+
std::cout << std::endl;
52+
}
53+
```
54+
* base[color ff0000]
55+
56+
### 出力
57+
```
58+
1 2 3 4 5
59+
```
60+
61+
## バージョン
62+
### 言語
63+
- C++23
64+
65+
### 処理系
66+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
67+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
68+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
69+
70+
## 参照
71+
- [N4950 26.7.28 Adjacent transform view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent.transform)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* adjacent_transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin(); // (1) C++23
10+
11+
constexpr auto begin() const
12+
requires range<const InnerView> &&
13+
regular_invocable<const F&, REPEAT(range_reference_t<const V>, N)...>; // (2) C++23
14+
```
15+
* REPEAT[italic]
16+
17+
## 概要
18+
19+
先頭を指すイテレータを取得する。
20+
21+
## 効果
22+
23+
- (1) : `return iterator<false>(*this, inner_.begin());`
24+
- (2) : `return iterator<true>(*this, inner_.begin());`
25+
26+
ここで、`iterator`は`adjacent_transform_view`の内部で定義される説明専用のイテレータクラスであり、`InnerView`は説明専用の[`adjacent_view`](../adjacent_view.md)`<V, N>`である。
27+
28+
## 備考
29+
- `REPEAT(T, N)` をT型のN個のパックとする。
30+
31+
32+
## 例
33+
```cpp example
34+
#include <ranges>
35+
#include <vector>
36+
#include <iostream>
37+
38+
int main() {
39+
std::vector<int> v = {1, 2, 3, 4, 5};
40+
41+
auto diff = [](int x, int y) { return y - x; };
42+
std::ranges::adjacent_transform_view<std::views::all_t<std::vector<int>&>, decltype(diff), 2> atv(v, diff);
43+
44+
auto it = atv.begin();
45+
46+
// 最初の要素(隣接する2要素の差)
47+
std::cout << *it << std::endl; // 2 - 1 = 1
48+
49+
// 次の要素へ
50+
++it;
51+
std::cout << *it << std::endl; // 3 - 2 = 1
52+
}
53+
```
54+
* begin[color ff0000]
55+
56+
### 出力
57+
```
58+
1
59+
1
60+
```
61+
62+
## バージョン
63+
### 言語
64+
- C++23
65+
66+
### 処理系
67+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
68+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
69+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
70+
71+
## 参照
72+
- [N4950 26.7.28 Adjacent transform view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent.transform)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* adjacent_transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto end(); // (1) C++23
10+
11+
constexpr auto end() const
12+
requires range<const InnerView> &&
13+
regular_invocable<const F&, REPEAT(range_reference_t<const V>, N)...>; // (2) C++23
14+
```
15+
* REPEAT[italic]
16+
17+
## 概要
18+
19+
番兵を取得する。
20+
21+
## 効果
22+
23+
`common_range<InnerView>`が`true`の場合:
24+
25+
- (1) : `return iterator<false>(*this, inner_.end());`
26+
- (2) : `return iterator<true>(*this, inner_.end());`
27+
28+
それ以外の場合:
29+
30+
- (1) : `return sentinel<false>(inner_.end());`
31+
- (2) : `return sentinel<true>(inner_.end());`
32+
33+
ここで、`iterator`と`sentinel`は`adjacent_transform_view`の内部で定義される説明専用のクラスであり、`InnerView`は説明専用の[`adjacent_view`](../adjacent_view.md)`<V, N>`である。
34+
35+
## 備考
36+
- `REPEAT(T, N)` をT型のN個のパックとする。
37+
38+
39+
## 例
40+
```cpp example
41+
#include <ranges>
42+
#include <vector>
43+
#include <iostream>
44+
45+
int main() {
46+
std::vector<int> v = {1, 2, 3, 4, 5};
47+
48+
auto diff = [](int x, int y) { return y - x; };
49+
std::ranges::adjacent_transform_view<std::views::all_t<std::vector<int>&>, decltype(diff), 2> atv(v, diff);
50+
51+
auto begin = atv.begin();
52+
auto end = atv.end();
53+
54+
// 全要素を出力
55+
for (auto it = begin; it != end; ++it) {
56+
std::cout << *it << " ";
57+
}
58+
std::cout << std::endl;
59+
}
60+
```
61+
* end[color ff0000]
62+
* begin[link begin.md]
63+
64+
### 出力
65+
```
66+
1 1 1 1
67+
```
68+
69+
## バージョン
70+
### 言語
71+
- C++23
72+
73+
### 処理系
74+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
75+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
76+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
77+
78+
## 参照
79+
- [N4950 26.7.28 Adjacent transform view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent.transform)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* adjacent_transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
adjacent_transform_view() = default; // (1) C++23
10+
11+
constexpr explicit
12+
adjacent_transform_view(V base, F fun); // (2) C++23
13+
```
14+
15+
## 概要
16+
17+
- (1) : デフォルトコンストラクタ
18+
- (2) : 元となるRangeと変換関数を受け取るコンストラクタ
19+
20+
## 効果
21+
22+
- (1) : `fun_`と`inner_`をデフォルト構築する
23+
- (2) : `fun_`を`std::move(fun)`で初期化し、`inner_`を`std::move(base)`で初期化する
24+
25+
## 例
26+
```cpp example
27+
#include <ranges>
28+
#include <vector>
29+
#include <iostream>
30+
31+
int main() {
32+
// (1) デフォルトコンストラクタ
33+
std::ranges::adjacent_transform_view<
34+
std::ranges::empty_view<int>,
35+
decltype([](int, int) { return 0; }),
36+
2
37+
> atv1;
38+
39+
// (2) 元となるRangeと変換関数を受け取るコンストラクタ
40+
std::vector<int> v = {1, 2, 3, 4, 5};
41+
auto diff = [](int x, int y) { return y - x; };
42+
std::ranges::adjacent_transform_view<std::views::all_t<std::vector<int>&>, decltype(diff), 2> atv2(v, diff);
43+
44+
for (int d : atv2) {
45+
std::cout << d << " ";
46+
}
47+
std::cout << std::endl;
48+
}
49+
```
50+
* std::ranges::adjacent_transform_view[color ff0000]
51+
* std::ranges::empty_view[link ../empty_view.md]
52+
53+
### 出力
54+
```
55+
1 1 1 1
56+
```
57+
58+
## バージョン
59+
### 言語
60+
- C++23
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
64+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
65+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
66+
67+
## 参照
68+
- [N4950 26.7.28 Adjacent transform view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent.transform)

0 commit comments

Comments
 (0)