Skip to content

Commit 4716074

Browse files
committed
adjacent_view : メンバ関数を追加 #713
1 parent 03cf02b commit 4716074

File tree

7 files changed

+411
-10
lines changed

7 files changed

+411
-10
lines changed

reference/ranges/adjacent_view.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ namespace std::ranges {
5050
5151
| 名前 | 説明 | 対応バージョン |
5252
|-----------------------------------------------------|----------------------------------|----------------|
53-
| [`(constructor)`](adjacent_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
54-
| [`base`](adjacent_view/base.md.nolink) | `V`の参照を取得する | C++23 |
55-
| [`begin`](adjacent_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
56-
| [`end`](adjacent_view/end.md.nolink) | 番兵を取得する | C++23 |
57-
| [`size`](adjacent_view/size.md.nolink) | 要素数を取得する | C++23 |
53+
| [`(constructor)`](adjacent_view/op_constructor.md) | コンストラクタ | C++23 |
54+
| [`base`](adjacent_view/base.md) | `V`の参照を取得する | C++23 |
55+
| [`begin`](adjacent_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
56+
| [`end`](adjacent_view/end.md) | 番兵を取得する | C++23 |
57+
| [`size`](adjacent_view/size.md) | 要素数を取得する | C++23 |
5858
5959
## 継承しているメンバ関数
6060
@@ -72,7 +72,7 @@ namespace std::ranges {
7272
7373
| 名前 | 説明 | 対応バージョン |
7474
|-------------------------------------------------------|------------------------------|----------------|
75-
| [`(deduction_guide)`](adjacent_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
75+
| [`(deduction_guide)`](adjacent_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
7676
7777
## 例
7878
```cpp example
@@ -105,14 +105,14 @@ int main() {
105105
- C++23
106106

107107
### 処理系
108-
- [Clang](/implementation.md#clang): ??
109-
- [GCC](/implementation.md#gcc): ??
110-
- [ICC](/implementation.md#icc): ??
111-
- [Visual C++](/implementation.md#visual_cpp): ??
108+
- [Clang](/implementation.md#clang): 19 [mark verified]
109+
- [GCC](/implementation.md#gcc): 13 [mark verified]
110+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
112111

113112
## 関連項目
114113
- [`adjacent_transform_view`](adjacent_transform_view.md): `adjacent_view` と同じように要素を取得して関数を適用する
115114
- [`slide_view`](slide_view.md): `adjacent_view` と同じように要素を取得するが、個数を実行時に指定する。内側は[`tuple`](/reference/tuple/tuple.md)ではなく[`view`](view.md)となる
116115

117116
## 参照
118117
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)
118+
- [P2321R2 zip](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2321r2.html)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* adjacent_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 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> v = {1, 2, 3, 4, 5};
33+
34+
std::ranges::adjacent_view<std::views::all_t<std::vector<int>&>, 3> av(v);
35+
36+
// (1) コピーして取得
37+
auto base1 = av.base();
38+
static_assert(std::same_as<decltype(base1), std::ranges::ref_view<std::vector<int>>>);
39+
40+
// (2) ムーブして取得
41+
auto base2 = std::move(av).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++23
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): 19 [mark verified]
64+
- [GCC](/implementation.md#gcc): 13 [mark verified]
65+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
66+
67+
## 参照
68+
- [N4950 26.7.27 Adjacent view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* adjacent_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin()
10+
requires (!simple-view<V>); // (1) C++23
11+
12+
constexpr auto begin() const
13+
requires range<const V>; // (2) C++23
14+
```
15+
16+
## 概要
17+
18+
先頭を指すイテレータを取得する。
19+
20+
## 効果
21+
22+
- (1) : `return iterator<false>(ranges::begin(base_), ranges::end(base_));`
23+
- (2) : `return iterator<true>(ranges::begin(base_), ranges::end(base_));`
24+
25+
ここで、`iterator`は`adjacent_view`の内部で定義される説明専用のイテレータクラスである。
26+
27+
## 例
28+
```cpp example
29+
#include <ranges>
30+
#include <vector>
31+
#include <iostream>
32+
33+
int main() {
34+
std::vector<int> v = {1, 2, 3, 4, 5};
35+
36+
std::ranges::adjacent_view<std::views::all_t<std::vector<int>&>, 3> av(v);
37+
38+
auto it = av.begin();
39+
40+
// 最初の要素(隣接する3要素のタプル)
41+
auto [a, b, c] = *it;
42+
std::cout << a << ", " << b << ", " << c << std::endl;
43+
44+
// 次の要素へ
45+
++it;
46+
auto [a2, b2, c2] = *it;
47+
std::cout << a2 << ", " << b2 << ", " << c2 << std::endl;
48+
}
49+
```
50+
* begin[color ff0000]
51+
52+
### 出力
53+
```
54+
1, 2, 3
55+
2, 3, 4
56+
```
57+
58+
## バージョン
59+
### 言語
60+
- C++23
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): 19 [mark verified]
64+
- [GCC](/implementation.md#gcc): 13 [mark verified]
65+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
66+
67+
## 参照
68+
- [N4950 26.7.27 Adjacent view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent)
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+
* adjacent_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto end()
10+
requires (!simple-view<V>); // (1) C++23
11+
12+
constexpr auto end() const
13+
requires range<const V>; // (2) C++23
14+
```
15+
16+
## 概要
17+
18+
番兵を取得する。
19+
20+
## 効果
21+
22+
`common_range<V>`が`true`の場合:
23+
24+
- (1) : `return iterator<false>(as-sentinel{ranges::end(base_)}, ranges::begin(base_), ranges::end(base_));`
25+
- (2) : `return iterator<true>(as-sentinel{ranges::end(base_)}, ranges::begin(base_), ranges::end(base_));`
26+
27+
それ以外の場合:
28+
29+
- (1) : `return sentinel<false>(ranges::end(base_));`
30+
- (2) : `return sentinel<true>(ranges::end(base_));`
31+
32+
ここで、`iterator`と`sentinel`は`adjacent_view`の内部で定義される説明専用のクラスであり、`as-sentinel`は説明専用の空クラスである。
33+
34+
## 例
35+
```cpp example
36+
#include <ranges>
37+
#include <vector>
38+
#include <iostream>
39+
40+
int main() {
41+
std::vector<int> v = {1, 2, 3, 4, 5};
42+
43+
std::ranges::adjacent_view<std::views::all_t<std::vector<int>&>, 3> av(v);
44+
45+
auto begin = av.begin();
46+
auto end = av.end();
47+
48+
// 全要素を出力
49+
for (auto it = begin; it != end; ++it) {
50+
auto [a, b, c] = *it;
51+
std::cout << a << ", " << b << ", " << c << std::endl;
52+
}
53+
}
54+
```
55+
* end[color ff0000]
56+
* begin[link begin.md]
57+
58+
### 出力
59+
```
60+
1, 2, 3
61+
2, 3, 4
62+
3, 4, 5
63+
```
64+
65+
## バージョン
66+
### 言語
67+
- C++23
68+
69+
### 処理系
70+
- [Clang](/implementation.md#clang): 19 [mark verified]
71+
- [GCC](/implementation.md#gcc): 13 [mark verified]
72+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
73+
74+
## 参照
75+
- [N4950 26.7.27 Adjacent view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent)
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+
* adjacent_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
adjacent_view()
10+
requires default_initializable<V> = default; // (1) C++23
11+
12+
constexpr explicit
13+
adjacent_view(V base); // (2) C++23
14+
```
15+
16+
## 概要
17+
18+
- (1) : デフォルトコンストラクタ
19+
- (2) : 元となるRangeを受け取るコンストラクタ
20+
21+
## 効果
22+
23+
- (1) : `base_`をデフォルト構築する
24+
- (2) : `base_`を`std::move(base)`で初期化する
25+
26+
## 例
27+
```cpp example
28+
#include <ranges>
29+
#include <vector>
30+
#include <iostream>
31+
32+
int main() {
33+
// (1) デフォルトコンストラクタ
34+
std::ranges::adjacent_view<std::ranges::empty_view<int>, 2> av1;
35+
36+
// (2) 元となるRangeを受け取るコンストラクタ
37+
std::vector<int> v = {1, 2, 3, 4, 5};
38+
std::ranges::adjacent_view<std::views::all_t<std::vector<int>&>, 3> av2(v);
39+
40+
for (auto [a, b, c] : av2) {
41+
std::cout << a << ", " << b << ", " << c << std::endl;
42+
}
43+
}
44+
```
45+
* std::ranges::adjacent_view[color ff0000]
46+
47+
### 出力
48+
```
49+
1, 2, 3
50+
2, 3, 4
51+
3, 4, 5
52+
```
53+
54+
## バージョン
55+
### 言語
56+
- C++23
57+
58+
### 処理系
59+
- [Clang](/implementation.md#clang): 19 [mark verified]
60+
- [GCC](/implementation.md#gcc): 13 [mark verified]
61+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
62+
63+
## 参照
64+
- [N4950 26.7.27 Adjacent view](https://timsong-cpp.github.io/cppwp/n4950/range.adjacent)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* adjacent_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
namespace std::ranges {
10+
template<class R>
11+
adjacent_view(R&&) -> adjacent_view<views::all_t<R>, 1>;
12+
}
13+
```
14+
15+
## 概要
16+
`adjacent_view`クラステンプレートの型推論補助。
17+
18+
## 備考
19+
20+
この推論補助は、第2テンプレート引数`N`のデフォルト値として`1`を使用する。
21+
22+
## 例
23+
```cpp example
24+
#include <ranges>
25+
#include <vector>
26+
#include <type_traits>
27+
28+
int main() {
29+
std::vector<int> v = {1, 2, 3, 4, 5};
30+
31+
// adjacent_viewの型を明示的に指定する必要がない(Nはデフォルトで1)
32+
std::ranges::adjacent_view av{v};
33+
34+
// 推論された型を確認
35+
static_assert(std::same_as<
36+
decltype(av),
37+
std::ranges::adjacent_view<std::ranges::ref_view<std::vector<int>>, 1>
38+
>);
39+
}
40+
```
41+
42+
### 出力
43+
```
44+
```
45+
46+
## バージョン
47+
### 言語
48+
- C++23
49+
50+
### 処理系
51+
- [Clang](/implementation.md#clang): 19 [mark verified]
52+
- [GCC](/implementation.md#gcc): 13 [mark verified]
53+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]

0 commit comments

Comments
 (0)