Skip to content

Commit 826d291

Browse files
committed
zip_transform_view : メンバ関数を追加 #713
1 parent d79c2be commit 826d291

File tree

6 files changed

+381
-14
lines changed

6 files changed

+381
-14
lines changed

reference/ranges/zip_transform_view.md

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,28 +51,28 @@ zipするRangeのサイズが異なっている場合、`zip_transform_view`の
5151
5252
| 名前 | 説明 | 対応バージョン |
5353
|--------------------------------------------------|----------------------------------|----------------|
54-
| [`(constructor)`](zip_transform_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
55-
| [`begin`](zip_transform_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
56-
| [`end`](zip_transform_view/end.md.nolink) | 番兵を取得する | C++23 |
57-
| [`size`](zip_transform_view/size.md.nolink) | 要素数を取得する | C++23 |
54+
| [`(constructor)`](zip_transform_view/op_constructor.md) | コンストラクタ | C++23 |
55+
| [`begin`](zip_transform_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
56+
| [`end`](zip_transform_view/end.md) | 番兵を取得する | C++23 |
57+
| [`size`](zip_transform_view/size.md) | 要素数を取得する | C++23 |
5858
5959
## 継承しているメンバ関数
6060
6161
| 名前 | 説明 | 対応バージョン |
6262
|----------------------------------------------|-----------------------------------|----------------|
63-
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
64-
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
65-
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
66-
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
63+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++23 |
64+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++23 |
65+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++23 |
66+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++23 |
6767
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
6868
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
69-
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
69+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++23 |
7070
7171
## 推論補助
7272
7373
| 名前 | 説明 | 対応バージョン |
7474
|-------------------------------------------------------|------------------------------|----------------|
75-
| [`(deduction_guide)`](zip_transform_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
75+
| [`(deduction_guide)`](zip_transform_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
7676
7777
## 例
7878
```cpp example
@@ -85,28 +85,30 @@ int main() {
8585
std::vector p = {1, 10, 100, 1000};
8686
8787
std::println("{}", std::views::zip_transform([](auto x, auto y){ return x * y; }, d, p));
88+
std::println("{}", std::views::zip_transform([](auto x, auto y){ return std::pair{x, y}; }, d, p));
8889
}
8990
```
9091
* std::views::zip_transform[color ff0000]
9192

9293
### 出力
9394
```
9495
[1, 20, 300]
96+
[(1, 1), (2, 10), (3, 100)]
9597
```
9698

9799
## バージョン
98100
### 言語
99101
- C++23
100102

101103
### 処理系
102-
- [Clang](/implementation.md#clang): ??
103-
- [GCC](/implementation.md#gcc): ??
104-
- [ICC](/implementation.md#icc): ??
105-
- [Visual C++](/implementation.md#visual_cpp): ??
104+
- [Clang](/implementation.md#clang): 19 [mark verified]
105+
- [GCC](/implementation.md#gcc): 13 [mark verified]
106+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 [mark verified]
106107

107108
## 関連項目
108109
- [`transform_view`](transform_view.md) zipする範囲が1つの場合
109110
- [`transform`](/reference/algorithm/ranges_transform.md) 2つのRangeから要素を1つずつ取り出して関数を呼び出し、結果を出力するアルゴリズム関数
110111

111112
## 参照
112113
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)
114+
- [P2321R2 zip](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2321r2.html)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* zip_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<
14+
const F&,
15+
range_reference_t<const Views>...
16+
>; // (2) C++23
17+
```
18+
* range[link ../range.md]
19+
* regular_invocable[link /reference/concepts/invocable.md]
20+
* range_reference_t[link ../range_reference_t.md]
21+
22+
## 概要
23+
24+
先頭を指すイテレータを取得する。
25+
26+
## 効果
27+
28+
- (1) : `return iterator<false>(*this, zip_.begin());`
29+
- (2) : `return iterator<true>(*this, zip_.begin());`
30+
31+
ここで、`iterator``zip_transform_view`の内部で定義される説明専用のイテレータクラスであり、`InnerView`は説明専用の[`zip_view`](../zip_view.md)`<Views...>`である。
32+
33+
##
34+
```cpp example
35+
#include <ranges>
36+
#include <vector>
37+
#include <list>
38+
#include <iostream>
39+
40+
int main() {
41+
std::vector<int> v = {1, 2, 3};
42+
std::list<char> l = {'a', 'b', 'c'};
43+
44+
auto f = [](int n, char c) { return std::pair{n * 10, c}; };
45+
std::ranges::zip_transform_view ztv(f, v, l);
46+
47+
auto it = ztv.begin();
48+
49+
// 最初の要素(変換結果)
50+
auto [n, c] = *it;
51+
std::cout << n << ", " << c << std::endl;
52+
53+
// 次の要素へ
54+
++it;
55+
auto [n2, c2] = *it;
56+
std::cout << n2 << ", " << c2 << std::endl;
57+
}
58+
```
59+
* begin[color ff0000]
60+
61+
### 出力
62+
```
63+
10, a
64+
20, b
65+
```
66+
67+
## バージョン
68+
### 言語
69+
- C++23
70+
71+
### 処理系
72+
- [Clang](/implementation.md#clang): 19 [mark verified]
73+
- [GCC](/implementation.md#gcc): 13 [mark verified]
74+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 [mark verified]
75+
76+
## 参照
77+
- [N4950 26.7.26 Zip transform view](https://timsong-cpp.github.io/cppwp/n4950/range.zip.transform)
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* zip_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<
14+
const F&,
15+
range_reference_t<const Views>...
16+
>; // (2) C++23
17+
```
18+
* range[link ../range.md]
19+
* regular_invocable[link /reference/concepts/invocable.md]
20+
* range_reference_t[link ../range_reference_t.md]
21+
22+
## 概要
23+
24+
番兵を取得する。
25+
26+
## 効果
27+
28+
説明専用コンセプト`zip-is-common`を用いて、
29+
30+
`zip-is-common<Views...>``false`の場合:
31+
32+
- (1) : `return sentinel<false>(zip_.end());`
33+
- (2) : `return sentinel<true>(zip_.end());`
34+
35+
それ以外の場合:
36+
37+
- (1) : `return iterator<false>(*this, zip_.end());`
38+
- (2) : `return iterator<true>(*this, zip_.end());`
39+
40+
ここで、`iterator``sentinel``zip_transform_view`の内部で定義される説明専用のクラスであり、`InnerView`は説明専用の[`zip_view`](../zip_view.md)`<Views...>`である。
41+
42+
##
43+
```cpp example
44+
#include <ranges>
45+
#include <vector>
46+
#include <list>
47+
#include <iostream>
48+
49+
int main() {
50+
std::vector<int> v = {1, 2, 3};
51+
std::list<char> l = {'a', 'b', 'c', 'd'};
52+
53+
auto f = [](int n, char c) { return std::pair{n * 10, c}; };
54+
std::ranges::zip_transform_view ztv(f, v, l);
55+
56+
auto begin = ztv.begin();
57+
auto end = ztv.end();
58+
59+
// 全要素を出力(短い方のRangeのサイズで終わる)
60+
for (auto it = begin; it != end; ++it) {
61+
auto [n, c] = *it;
62+
std::cout << n << ", " << c << std::endl;
63+
}
64+
}
65+
```
66+
* end[color ff0000]
67+
* begin[link begin.md]
68+
69+
### 出力
70+
```
71+
10, a
72+
20, b
73+
30, c
74+
```
75+
76+
## バージョン
77+
### 言語
78+
- C++23
79+
80+
### 処理系
81+
- [Clang](/implementation.md#clang): 19 [mark verified]
82+
- [GCC](/implementation.md#gcc): 13 [mark verified]
83+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 [mark verified]
84+
85+
## 参照
86+
- [N4950 26.7.26 Zip transform view](https://timsong-cpp.github.io/cppwp/n4950/range.zip.transform)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* zip_transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
zip_transform_view() = default; // (1) C++23
10+
11+
constexpr explicit
12+
zip_transform_view(F fun, Views... views); // (2) C++23
13+
```
14+
15+
## 概要
16+
17+
- (1) : デフォルトコンストラクタ
18+
- (2) : 変換関数と各Rangeを受け取るコンストラクタ
19+
20+
## 効果
21+
22+
- (1) : `fun_`と`zip_`をデフォルト構築する
23+
- (2) : `fun_`を`std::move(fun)`で初期化し、`zip_`を`std::move(views)...`で初期化する
24+
25+
## 例
26+
```cpp example
27+
#include <ranges>
28+
#include <vector>
29+
#include <list>
30+
#include <iostream>
31+
32+
int main() {
33+
// (1) デフォルトコンストラクタ
34+
std::ranges::zip_transform_view<
35+
decltype([](int, char) { return 0; }),
36+
std::ranges::empty_view<int>,
37+
std::ranges::empty_view<char>
38+
> ztv1;
39+
40+
// (2) 変換関数と各Rangeを受け取るコンストラクタ
41+
std::vector<int> v = {1, 2, 3};
42+
std::list<char> l = {'a', 'b', 'c', 'd'};
43+
44+
auto f = [](int n, char c) { return std::pair{n * 10, c}; };
45+
std::ranges::zip_transform_view ztv2(f, v, l);
46+
47+
for (auto [n, c] : ztv2) {
48+
std::cout << n << ", " << c << std::endl;
49+
}
50+
}
51+
```
52+
* std::ranges::zip_transform_view[color ff0000]
53+
54+
### 出力
55+
```
56+
10, a
57+
20, b
58+
30, c
59+
```
60+
61+
## バージョン
62+
### 言語
63+
- C++23
64+
65+
### 処理系
66+
- [Clang](/implementation.md#clang): 19 [mark verified]
67+
- [GCC](/implementation.md#gcc): 13 [mark verified]
68+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 [mark verified]
69+
70+
## 参照
71+
- [N4950 26.7.26 Zip transform view](https://timsong-cpp.github.io/cppwp/n4950/range.zip.transform)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* zip_transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
namespace std::ranges {
10+
template<class F, class... Rs>
11+
zip_transform_view(F, Rs&&...) ->
12+
zip_transform_view<F, views::all_t<Rs>...>;
13+
}
14+
```
15+
16+
## 概要
17+
`zip_transform_view`クラステンプレートの型推論補助。
18+
19+
## 例
20+
```cpp example
21+
#include <ranges>
22+
#include <vector>
23+
#include <list>
24+
#include <type_traits>
25+
26+
int main() {
27+
std::vector<int> v = {1, 2, 3};
28+
std::list<char> l = {'a', 'b', 'c'};
29+
30+
auto f = [](int n, char c) { return std::pair{n * 10, c}; };
31+
32+
// zip_transform_viewの型を明示的に指定する必要がない
33+
std::ranges::zip_transform_view ztv{f, v, l};
34+
35+
// 推論された型を確認
36+
static_assert(std::same_as<
37+
decltype(ztv),
38+
std::ranges::zip_transform_view<
39+
decltype(f),
40+
std::ranges::ref_view<std::vector<int>>,
41+
std::ranges::ref_view<std::list<char>>
42+
>
43+
>);
44+
}
45+
```
46+
* std::ranges::zip_transform_view[color ff0000]
47+
48+
### 出力
49+
```
50+
```
51+
52+
## バージョン
53+
### 言語
54+
- C++23
55+
56+
### 処理系
57+
- [Clang](/implementation.md#clang): 19 [mark verified]
58+
- [GCC](/implementation.md#gcc): 13 [mark verified]
59+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 [mark verified]

0 commit comments

Comments
 (0)