Skip to content

Commit d02a7ee

Browse files
committed
zip_tramsform_view #1063
1 parent 1e44b92 commit d02a7ee

File tree

6 files changed

+128
-5
lines changed

6 files changed

+128
-5
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@
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+
* invocable[link /reference/concepts/invocable.md]
78+
* regular_invocable[link /reference/concepts/invocable.md]
7779
* same_as[link /reference/concepts/same_as.md]
7880
* <condition_variable>[link /reference/condition_variable.md]
7981
* std::condition_variable[link /reference/condition_variable/condition_variable.md]
@@ -238,10 +240,12 @@
238240
* std::tuple[link /reference/tuple/tuple.md]
239241
* std::tie[link /reference/tuple/tie.md]
240242
* <type_traits>[link /reference/type_traits.md]
243+
* invoke_result_t[link /reference/type_traits/invoke_result.md]
244+
* is_object_v[link /reference/type_traits/is_object.md]
241245
* remove_cvref_t[link /reference/type_traits/remove_cvref.md]
242246
* std::false_type[link /reference/type_traits/false_type.md]
243-
* std::is_same[link /reference/type_traits/is_same.md]
244247
* std::is_same_v[link /reference/type_traits/is_same.md]
248+
* std::is_same[link /reference/type_traits/is_same.md]
245249
* std::true_type[link /reference/type_traits/true_type.md]
246250
* <typeindex>[link /reference/typeindex.md]
247251
* <typeinfo>[link /reference/typeinfo.md]

reference/algorithm/ranges_transform.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,4 @@ cccc
212212
## 関連項目
213213

214214
- [`transform_view`](/reference/ranges/transform_view.md) : 要素に関数を適用した結果をビューとして提供する
215+
- [`zip_transform_view`](/reference/ranges/zip_transform_view.md) : 複数の範囲から要素を取り出し、関数を適用した結果をビューとして提供する

reference/ranges.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,15 +339,15 @@ range | adaptor(args...)
339339
340340
| 名前 | 説明 | 対応バージョン |
341341
|--------------------------------------------------------|-------------------------------------------------------------------------------------|----------------|
342-
| [`zip_view`](ranges/zip_view.md) | 2つのシーケンスから値を1つずつ取り出した`tuple`のビュー (class template) | C++23 |
342+
| [`zip_view`](ranges/zip_view.md) | 複数のシーケンスから値を1つずつ取り出した`tuple`のビュー (class template) | C++23 |
343343
| [`views::zip`](ranges/zip_view.md) | `zip_view`を生成する (customization point object) | C++23 |
344344
345345
### zip transform view
346346
347347
| 名前 | 説明 | 対応バージョン |
348348
|--------------------------------------------------------|-------------------------------------------------------------------------------------|----------------|
349-
| [`zip_transform_view`](ranges/zip_transform_view.md.nolink) | 2つのシーケンスから値を1つずつ取り出し、関数を適用した結果のビュー (class template) | C++23 |
350-
| [`views::zip_transform`](ranges/zip_transform_view.md.nolink) | `zip_transform_view`を生成する (customization point object) | C++23 |
349+
| [`zip_transform_view`](ranges/zip_transform_view.md) | 複数のシーケンスから値を1つずつ取り出し、関数を適用した結果のビュー (class template) | C++23 |
350+
| [`views::zip_transform`](ranges/zip_transform_view.md) | `zip_transform_view`を生成する (customization point object) | C++23 |
351351
352352
### adjacent view
353353

reference/ranges/transform_view.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ int main() {
150150
151151
## 関連項目
152152
- [`std::transform`](/reference/algorithm/transform.md), [`std::ranges::transform`](/reference/algorithm/ranges_transform.md): Rangeの要素に先行評価で関数を適用する標準アルゴリズム関数
153+
- [`zip_transform_view`](zip_transform_view.md) : 複数の範囲から要素を取り出し、関数を適用した結果をビューとして提供する
153154
154155
## 参照
155156
- [N4861 24 Ranges library](https://timsong-cpp.github.io/cppwp/n4861/ranges)
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# zip_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<move_constructible F, input_range... Views>
10+
requires (view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
11+
regular_invocable<F&, range_reference_t<Views>...> &&
12+
can-reference<invoke_result_t<F&, range_reference_t<Views>...>>
13+
class zip_transform_view : public view_interface<zip_transform_view<F, Views...>> {…… }; // (1)
14+
15+
namespace views {
16+
inline constexpr /*unspecified*/ zip_transform = /*unspecified*/; // (2)
17+
}
18+
}
19+
```
20+
* can-reference[link /reference/iterator/dereferenceable.md]
21+
22+
## 概要
23+
24+
`zip_transform_view`は複数のRangeから要素を1つずつ取得し、それらを引数として関数を呼び出した結果を要素とする[`view`](view.md)。
25+
26+
`zip_transform_view`の要素を1つ取得するごとに、各Rangeの要素を1つずつ取得する。
27+
28+
zipするRangeのサイズが異なっている場合、`zip_transform_view`のサイズはそれらの中で最小のサイズとなる。
29+
30+
- (1): `zip_transform_view`のクラス定義
31+
- (2): `zip_transform_view`を生成するカスタマイゼーションポイントオブジェクト(Rangeアダプタオブジェクトではない)
32+
33+
34+
### Rangeコンセプト
35+
36+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
37+
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
38+
| | (1) | 〇 | 〇 | (2) | (3) | (4) | | (5) | ○ | ○ |
39+
40+
- (1): zipするすべてのRangeが[`sized_range`](sized_range.md)のとき
41+
- (2): zipするすべてのRangeが[`forward_range`](forward_range.md)のとき
42+
- (3): zipするすべてのRangeが[`bidirectional_range`](bidirectional_range.md)のとき
43+
- (4): zipするすべてのRangeが[`random_access_range`](random_access_range.md)のとき
44+
- (5): *zip-is-common*のとき
45+
46+
## 効果
47+
48+
- (2): `F`を部分式、`Es...`を部分式のパックとする。式 `views::zip_transform(F, Es...)` の効果は以下の通り。
49+
- `Es` が空でないとき、`zip_transform_view(F, Es...)` と等しい
50+
- `Es` が空のとき、 `FD` を [`decay_t`](/reference/type_traits/decay.md)`<decltype((F))>`として、
51+
- `((void)F, auto(`[`views::empty`](empty_view.md)`<`[`decay_t`](/reference/type_traits/decay.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`<FD&>>>))` と等しい
52+
- ただし、 [`move_constructible`](/reference/concepts/move_constructible.md)`<FD> && `[`regular_invocable`](/reference/concepts/invocable.md)`<FD&>` が `false`、または [`decay_t`](/reference/type_traits/decay.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`<FD&>>` がオブジェクト型でないとき、ill-formed
53+
54+
55+
## メンバ関数
56+
57+
| 名前 | 説明 | 対応バージョン |
58+
|--------------------------------------------------|----------------------------------|----------------|
59+
| [`(constructor)`](zip_transform_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
60+
| [`begin`](zip_transform_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
61+
| [`end`](zip_transform_view/end.md.nolink) | 番兵を取得する | C++23 |
62+
| [`size`](take_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)`](zip_transform_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 d = {1, 2, 3};
90+
std::vector p = {1, 10, 100, 1000};
91+
92+
std::println("{}", std::views::zip_transform([](auto x, auto y){ return x * y }, d, p));
93+
}
94+
```
95+
* std::views::zip_transform[color ff0000]
96+
97+
### 出力
98+
```
99+
[1, 20, 300]
100+
```
101+
102+
## バージョン
103+
### 言語
104+
- C++23
105+
106+
### 処理系
107+
- [Clang](/implementation.md#clang): ??
108+
- [GCC](/implementation.md#gcc): ??
109+
- [ICC](/implementation.md#icc): ??
110+
- [Visual C++](/implementation.md#visual_cpp): ??
111+
112+
## 関連項目
113+
- [`transform_view`](transform_view.md) zipする範囲が1つの場合
114+
- [`transform`](/reference/algorithm/ranges_transform.md) 2つのRangeから要素を1つずつ取り出して関数を呼び出し、結果を出力するアルゴリズム関数
115+
116+
## 参照
117+
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)

reference/ranges/zip_view.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ int main() {
137137

138138
## 関連項目
139139
- [`elements_view`](elements_view.md) zipの逆(タプルから要素を取り出す)
140-
- [`zip_transform_view`](zip_transform_view.md.nolink) zipして関数を適用する
140+
- [`zip_transform_view`](zip_transform_view.md) zipして関数を適用する
141141

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

0 commit comments

Comments
 (0)