Skip to content

Commit 15c75ce

Browse files
committed
transform_view : メンバ関数を追加 #713
1 parent a1eaff0 commit 15c75ce

File tree

8 files changed

+432
-15
lines changed

8 files changed

+432
-15
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,14 @@
238238
* range_size_t[link /reference/ranges/range_size_t.md]
239239
* range_value_t[link /reference/ranges/range_value_t.md]
240240
* range[link /reference/ranges/range.md]
241+
* ranges::begin[link /reference/ranges/begin.md]
242+
* ranges::end[link /reference/ranges/end.md]
243+
* ranges::size[link /reference/ranges/size.md]
241244
* ref_view[link /reference/ranges/ref_view.md]
242245
* sentinel_t[link /reference/ranges/sentinel_t.md]
243246
* sized_range[link /reference/ranges/sized_range.md]
247+
* std::ranges::owning_view[link /reference/ranges/owning_view.md]
248+
* std::ranges::ref_view[link /reference/ranges/ref_view.md]
244249
* subrange[link /reference/ranges/subrange.md]
245250
* view_interface[link /reference/ranges/view_interface.md]
246251
* view[link /reference/ranges/view.md]

reference/ranges/transform_view.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,33 @@ namespace std::ranges {
4444
4545
## メンバ関数
4646
47-
| 名前 | 説明 | 対応バージョン |
48-
|--------------------------------------------------|----------------------------------|----------------|
49-
| [`(constructor)`](transform_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
50-
| [`base`](transform_view/base.md.nolink) | `V`の参照を取得する | C++20 |
51-
| [`begin`](transform_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
52-
| [`end`](transform_view/end.md.nolink) | 番兵を取得する | C++20 |
53-
| [`size`](transform_view/size.md.nolink) | 要素数を取得する | C++20 |
47+
| 名前 | 説明 | 対応バージョン |
48+
|-----------------------------------------------------|----------------------------------|----------------|
49+
| [`(constructor)`](transform_view/op_constructor.md) | コンストラクタ | C++20 |
50+
| [`base`](transform_view/base.md) | `V`の参照を取得する | C++20 |
51+
| [`begin`](transform_view/begin.md) | 先頭を指すイテレータを取得する | C++20 |
52+
| [`end`](transform_view/end.md) | 番兵を取得する | C++20 |
53+
| [`size`](transform_view/size.md) | 要素数を取得する | C++20 |
5454
5555
`r`を元のRangeとする。`size`は[`ranges::size`](size.md)`(r)`が有効な式であるときに定義される。
5656
5757
## 継承しているメンバ関数
5858
59-
| 名前 | 説明 | 対応バージョン |
60-
|----------------------------------------------|----------------------------------|----------------|
59+
| 名前 | 説明 | 対応バージョン |
60+
|----------------------------------------------|-----------------------------------|----------------|
6161
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
6262
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
63-
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
64-
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
65-
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
66-
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
67-
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
63+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
64+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
65+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
66+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
67+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
6868
6969
## 推論補助
7070
7171
| 名前 | 説明 | 対応バージョン |
7272
|-------------------------------------------------------|------------------------------|----------------|
73-
| [`(deduction_guide)`](transform_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
73+
| [`(deduction_guide)`](transform_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++20 |
7474
7575
## 例
7676
```cpp example
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const &
10+
requires copy_constructible<V>; // (1) C++20
11+
12+
constexpr V base() &&; // (2) C++20
13+
```
14+
15+
## 概要
16+
17+
メンバ変数として保持している、元の`view`を取得する。
18+
19+
## 効果
20+
21+
入力`view``V`)のオブジェクトを`base_`というメンバに保持するとして
22+
23+
- (1) : `return base_;` と等価
24+
- (2) : `return std::move(base_);` と等価
25+
26+
##
27+
28+
```cpp example
29+
#include <ranges>
30+
#include <vector>
31+
#include <iostream>
32+
33+
int main() {
34+
using std::ranges::view;
35+
36+
std::vector<int> vec = {1, 2, 3, 4, 5};
37+
38+
std::ranges::transform_view r{vec, [](int i) { return i * 2; }};
39+
40+
// (1) コピーして取得
41+
view auto b1 = r.base();
42+
43+
// (2) ムーブして取得
44+
view auto b2 = std::move(r).base();
45+
46+
// 得られるのは元のRangeではなく、あくまでview
47+
static_assert(not std::same_as<decltype(b1), std::vector<int>>);
48+
static_assert( std::same_as<decltype(b1), std::ranges::ref_view<std::vector<int>>>);
49+
static_assert( std::same_as<decltype(b2), std::ranges::ref_view<std::vector<int>>>);
50+
}
51+
```
52+
* base[color ff0000]
53+
54+
### 出力
55+
56+
```
57+
```
58+
59+
## バージョン
60+
### 言語
61+
- C++20
62+
63+
### 処理系
64+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
65+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
66+
- [ICC](/implementation.md#icc): ?
67+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr iterator<false> begin(); // (1) C++20
10+
11+
constexpr iterator<true> begin() const
12+
requires range<const V> &&
13+
regular_invocable<
14+
const F&,
15+
range_reference_t<const V>
16+
>; // (2) C++20
17+
```
18+
19+
## 概要
20+
21+
`view`の先頭要素を指すイテレータを取得する。
22+
23+
## 戻り値
24+
- (1) : 以下と等価:
25+
```cpp
26+
return iterator<false>{*this, ranges::begin(base_)};
27+
```
28+
29+
- (2) : 以下と等価:
30+
```cpp
31+
return iterator<true>{*this, ranges::begin(base_)};
32+
```
33+
34+
35+
##
36+
37+
```cpp example
38+
#include <ranges>
39+
#include <vector>
40+
#include <string>
41+
#include <iostream>
42+
43+
int main() {
44+
std::vector<int> vec = {1, 2, 3, 4, 5};
45+
46+
std::ranges::transform_view r{vec, [](int i) { return std::to_string(i); }};
47+
48+
auto it = r.begin();
49+
50+
std::string x = *it;
51+
std::cout << x << '\n';
52+
}
53+
```
54+
* begin[color ff0000]
55+
56+
### 出力
57+
58+
```
59+
1
60+
```
61+
62+
## バージョン
63+
### 言語
64+
- C++20
65+
66+
### 処理系
67+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
68+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
69+
- [ICC](/implementation.md#icc): ?
70+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr sentinel<false> end(); // (1) C++20
10+
11+
constexpr iterator<false> end() // (2) C++20
12+
requires common_range<V>;
13+
14+
constexpr sentinel<true> end() const
15+
requires range<const V> &&
16+
regular_invocable<
17+
const F&,
18+
range_reference_t<const V>
19+
>; // (3) C++20
20+
21+
constexpr iterator<true> end() const
22+
requires common_range<const V> &&
23+
regular_invocable<
24+
const F&,
25+
range_reference_t<const V>
26+
>; // (4) C++20
27+
```
28+
29+
## 概要
30+
番兵を取得する。
31+
32+
## 戻り値
33+
- (1) : 以下と等価:
34+
```cpp
35+
return sentinel<false>{ranges::end(base_)};
36+
```
37+
38+
- (2) : 以下と等価:
39+
```cpp
40+
return iterator<false>{*this, ranges::end(base_)};
41+
```
42+
43+
- (3) : 以下と等価:
44+
```cpp
45+
return sentinel<true>{ranges::end(base_)};
46+
```
47+
48+
- (4) : 以下と等価:
49+
```cpp
50+
return iterator<true>{*this, ranges::end(base_)};
51+
```
52+
53+
54+
##
55+
56+
```cpp example
57+
#include <ranges>
58+
#include <vector>
59+
#include <string>
60+
#include <iostream>
61+
62+
int main() {
63+
std::vector<int> vec = {1, 2, 3, 4, 5};
64+
65+
std::ranges::transform_view r{vec, [](int i) { return std::to_string(i); }};
66+
67+
auto it = r.begin();
68+
auto end_it = r.end();
69+
while (it != end_it) {
70+
std::string x = *it;
71+
std::cout << x << std::endl;
72+
++it;
73+
}
74+
}
75+
```
76+
* end[color ff0000]
77+
* begin[link begin.md]
78+
79+
### 出力
80+
81+
```
82+
1
83+
2
84+
3
85+
4
86+
5
87+
```
88+
89+
## バージョン
90+
### 言語
91+
- C++20
92+
93+
### 処理系
94+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
95+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
96+
- [ICC](/implementation.md#icc): ?
97+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* transform_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
transform_view()
10+
requires default_initializable<V> &&
11+
default_initializable<F> = default; // (1) C++20
12+
13+
constexpr explicit
14+
transform_view(V base, F fun); // (2) C++20
15+
```
16+
17+
## 概要
18+
19+
[`transform_view`](../transform_view.md)オブジェクトを構築する。
20+
21+
- (1) : デフォルト構築
22+
- (2) : 元となるviewと変換関数を指定して構築
23+
24+
25+
## 効果
26+
27+
- (2) : メンバ変数`base_`を`std::move(base)`で、メンバ変数`fun_`を`std::move(fun)`で初期化する
28+
29+
30+
## 例
31+
```cpp example
32+
#include <iostream>
33+
#include <ranges>
34+
#include <vector>
35+
36+
int main() {
37+
std::vector<int> vec = {1, 2, 3, 4, 5};
38+
39+
std::ranges::transform_view view{vec, [](int x){ return x * 2; }};
40+
for (const auto& x : view) {
41+
std::cout << x << std::endl;
42+
}
43+
}
44+
```
45+
* transform_view[color ff0000]
46+
47+
### 出力
48+
```
49+
2
50+
4
51+
6
52+
8
53+
10
54+
```
55+
56+
## バージョン
57+
### 言語
58+
- C++20
59+
60+
### 処理系
61+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
62+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
63+
- [ICC](/implementation.md#icc): ?
64+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

0 commit comments

Comments
 (0)