Skip to content

Commit 305a617

Browse files
committed
reverse_view : メンバ関数を追加 #713
1 parent a878933 commit 305a617

7 files changed

Lines changed: 408 additions & 8 deletions

File tree

reference/ranges/reverse_view.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ namespace std::ranges {
5151
5252
| 名前 | 説明 | 対応バージョン |
5353
|--------------------------------------------------|-----------------------------------|----------------|
54-
| [`(constructor)`](reverse_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
55-
| [`base`](reverse_view/base.md.nolink) | `V`の参照を取得する | C++20 |
56-
| [`begin`](reverse_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
57-
| [`end`](reverse_view/end.md.nolink) | 番兵を取得する | C++20 |
58-
| [`size`](reverse_view/size.md.nolink) | 要素数を取得する | C++20 |
54+
| [`(constructor)`](reverse_view/op_constructor.md) | コンストラクタ | C++20 |
55+
| [`base`](reverse_view/base.md) | `V`の参照を取得する | C++20 |
56+
| [`begin`](reverse_view/begin.md) | 先頭を指すイテレータを取得する | C++20 |
57+
| [`end`](reverse_view/end.md) | 番兵を取得する | C++20 |
58+
| [`size`](reverse_view/size.md) | 要素数を取得する | C++20 |
5959
6060
`r`を参照先のRangeとする。`size`は、[`ranges::size`](size.md)`(r)`が有効な式であるときに定義される。
6161
@@ -69,14 +69,14 @@ namespace std::ranges {
6969
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
7070
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
7171
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
72-
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
73-
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
72+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
73+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
7474
7575
## 推論補助
7676
7777
| 名前 | 説明 | 対応バージョン |
7878
|-------------------------------------------------------|------------------------------|----------------|
79-
| [`(deduction_guide)`](reverse_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
79+
| [`(deduction_guide)`](reverse_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++20 |
8080
8181
## 例
8282
```cpp example
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* reverse_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+
- (1) : `return base_;`
22+
- (2) : `return std::move(base_);`
23+
24+
##
25+
```cpp example
26+
#include <ranges>
27+
#include <vector>
28+
#include <concepts>
29+
#include <iostream>
30+
31+
int main() {
32+
std::vector<int> vec = {1, 2, 3, 4, 5};
33+
34+
std::ranges::reverse_view rv(vec);
35+
36+
// (1) コピーして取得
37+
auto base1 = rv.base();
38+
static_assert(std::same_as<decltype(base1), std::ranges::ref_view<std::vector<int>>>);
39+
40+
// (2) ムーブして取得
41+
auto base2 = std::move(rv).base();
42+
static_assert(std::same_as<decltype(base2), std::ranges::ref_view<std::vector<int>>>);
43+
44+
// 取得したviewを使用(元の順序)
45+
for (int n : base1) {
46+
std::cout << n << " ";
47+
}
48+
std::cout << std::endl;
49+
}
50+
```
51+
* base[color ff0000]
52+
53+
### 出力
54+
```
55+
1 2 3 4 5
56+
```
57+
58+
## バージョン
59+
### 言語
60+
- C++20
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
64+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
65+
- [ICC](/implementation.md#icc): ?
66+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
67+
68+
## 参照
69+
- [N4861 24.7.6.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.reverse.view)
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+
* reverse_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr reverse_iterator<iterator_t<V>> begin(); // (1) C++20
10+
11+
constexpr reverse_iterator<iterator_t<V>> begin()
12+
requires common_range<V>; // (2) C++20
13+
14+
constexpr auto begin() const
15+
requires common_range<const V>; // (3) C++20
16+
```
17+
* reverse_iterator[link /reference/iterator/reverse_iterator.md]
18+
19+
## 概要
20+
21+
先頭を指すイテレータを取得する。
22+
23+
## 効果
24+
25+
- (1) : キャッシュが空の場合、`cache_ = make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_)))`を実行する。そうでなければ`return *cache_;`
26+
- (2) : `return make_reverse_iterator(ranges::end(base_));`
27+
- (3) : `return make_reverse_iterator(ranges::end(base_));`
28+
29+
## 備考
30+
31+
- (1)は、[`common_range`](../common_range.md)ではないRangeのために、終端位置をキャッシュして償却定数時間で返す
32+
33+
##
34+
```cpp example
35+
#include <ranges>
36+
#include <vector>
37+
#include <iostream>
38+
39+
int main() {
40+
std::vector<int> vec = {1, 2, 3, 4, 5};
41+
42+
std::ranges::reverse_view rv(vec);
43+
44+
auto it = rv.begin();
45+
46+
// 逆順に出力
47+
std::cout << *it << std::endl; // 5
48+
++it;
49+
std::cout << *it << std::endl; // 4
50+
51+
// const版
52+
const auto& crv = rv;
53+
auto cit = crv.begin();
54+
std::cout << *cit << std::endl; // 5
55+
}
56+
```
57+
* begin[color ff0000]
58+
59+
### 出力
60+
```
61+
5
62+
4
63+
5
64+
```
65+
66+
## バージョン
67+
### 言語
68+
- C++20
69+
70+
### 処理系
71+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
72+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
73+
- [ICC](/implementation.md#icc): ?
74+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
75+
76+
## 参照
77+
- [N4861 24.7.6.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.reverse.view)
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* reverse_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr reverse_iterator<iterator_t<V>> end(); // (1) C++20
10+
11+
constexpr auto end() const
12+
requires common_range<const V>; // (2) C++20
13+
```
14+
* reverse_iterator[link /reference/iterator/reverse_iterator.md]
15+
16+
## 概要
17+
18+
番兵を取得する。
19+
20+
## 効果
21+
22+
- (1) : `return make_reverse_iterator(ranges::begin(base_));`
23+
- (2) : `return make_reverse_iterator(ranges::begin(base_));`
24+
25+
##
26+
```cpp example
27+
#include <ranges>
28+
#include <vector>
29+
#include <iostream>
30+
31+
int main() {
32+
std::vector<int> vec = {1, 2, 3, 4, 5};
33+
34+
std::ranges::reverse_view rv(vec);
35+
36+
auto begin = rv.begin();
37+
auto end = rv.end();
38+
39+
// 逆順に全要素を出力
40+
for (auto it = begin; it != end; ++it) {
41+
std::cout << *it << " ";
42+
}
43+
std::cout << std::endl;
44+
45+
// const版
46+
const auto& crv = rv;
47+
auto cbegin = crv.begin();
48+
auto cend = crv.end();
49+
for (auto it = cbegin; it != cend; ++it) {
50+
std::cout << *it << " ";
51+
}
52+
std::cout << std::endl;
53+
}
54+
```
55+
* end[color ff0000]
56+
* begin[link begin.md]
57+
58+
### 出力
59+
```
60+
5 4 3 2 1
61+
5 4 3 2 1
62+
```
63+
64+
## バージョン
65+
### 言語
66+
- C++20
67+
68+
### 処理系
69+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
70+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
71+
- [ICC](/implementation.md#icc): ?
72+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
73+
74+
## 参照
75+
- [N4861 24.7.6.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.reverse.view)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* reverse_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
reverse_view()
10+
requires default_initializable<V> = default; // (1) C++20
11+
12+
constexpr explicit
13+
reverse_view(V r); // (2) C++20
14+
```
15+
16+
## 概要
17+
18+
- (1) : デフォルトコンストラクタ
19+
- (2) : 元となるRangeを受け取るコンストラクタ
20+
21+
## 効果
22+
23+
- (1) : `base_`をデフォルト構築する
24+
- (2) : `base_`を`std::move(r)`で初期化する
25+
26+
## 例
27+
```cpp example
28+
#include <ranges>
29+
#include <vector>
30+
#include <iostream>
31+
32+
int main() {
33+
std::vector<int> vec = {1, 2, 3, 4, 5};
34+
35+
// (1) デフォルトコンストラクタ
36+
std::ranges::reverse_view<std::ranges::empty_view<int>> rv1;
37+
38+
// (2) 元となるRangeを受け取るコンストラクタ
39+
std::ranges::reverse_view rv2(vec);
40+
41+
for (int n : rv2) {
42+
std::cout << n << " ";
43+
}
44+
std::cout << std::endl;
45+
}
46+
```
47+
* std::ranges::reverse_view[color ff0000]
48+
49+
### 出力
50+
```
51+
5 4 3 2 1
52+
```
53+
54+
## バージョン
55+
### 言語
56+
- C++20
57+
58+
### 処理系
59+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
60+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
61+
- [ICC](/implementation.md#icc): ?
62+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
63+
64+
## 参照
65+
- [N4861 24.7.6.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.reverse.view)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* reverse_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
namespace std::ranges {
10+
template<class R>
11+
reverse_view(R&&) -> reverse_view<views::all_t<R>>;
12+
}
13+
```
14+
15+
## 概要
16+
`reverse_view`クラステンプレートの型推論補助。
17+
18+
## 例
19+
```cpp example
20+
#include <ranges>
21+
#include <vector>
22+
#include <type_traits>
23+
24+
int main() {
25+
std::vector<int> vec = {1, 2, 3, 4, 5};
26+
27+
// reverse_viewの型を明示的に指定する必要がない
28+
std::ranges::reverse_view rv{vec};
29+
30+
// 推論された型を確認
31+
static_assert(std::same_as<
32+
decltype(rv),
33+
std::ranges::reverse_view<std::ranges::ref_view<std::vector<int>>>
34+
>);
35+
}
36+
```
37+
* std::ranges::reverse_view[color ff0000]
38+
39+
### 出力
40+
```
41+
```
42+
43+
## バージョン
44+
### 言語
45+
- C++20
46+
47+
### 処理系
48+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
49+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
50+
- [ICC](/implementation.md#icc): ?
51+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

0 commit comments

Comments
 (0)