Skip to content

Commit d79c2be

Browse files
committed
stride_view : メンバ関数を追加 #713
1 parent f69a490 commit d79c2be

File tree

8 files changed

+451
-15
lines changed

8 files changed

+451
-15
lines changed

reference/ranges/stride_view.md

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,30 +39,30 @@ namespace std::ranges {
3939
4040
| 名前 | 説明 | 対応バージョン |
4141
|--------------------------------------------------|----------------------------------|----------------|
42-
| [`(constructor)`](stride_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
43-
| [`base`](stride_view/base.md.nolink) | `V`の参照を取得する | C++23 |
44-
| [`stride`](stride_view/stride.md.nolink) | 1回で移動する要素数を取得する | C++23 |
45-
| [`begin`](stride_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
46-
| [`end`](stride_view/end.md.nolink) | 番兵を取得する | C++23 |
47-
| [`size`](stride_view/size.md.nolink) | 要素数を取得する | C++23 |
42+
| [`(constructor)`](stride_view/op_constructor.md) | コンストラクタ | C++23 |
43+
| [`base`](stride_view/base.md) | `V`の参照を取得する | C++23 |
44+
| [`stride`](stride_view/stride.md) | 1回で移動する要素数を取得する | C++23 |
45+
| [`begin`](stride_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
46+
| [`end`](stride_view/end.md) | 番兵を取得する | C++23 |
47+
| [`size`](stride_view/size.md) | 要素数を取得する | C++23 |
4848
4949
## 継承しているメンバ関数
5050
5151
| 名前 | 説明 | 対応バージョン |
5252
|----------------------------------------------|-----------------------------------|----------------|
53-
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
54-
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
55-
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
56-
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
53+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++23 |
54+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++23 |
55+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++23 |
56+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++23 |
5757
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
5858
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
59-
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
59+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++23 |
6060
6161
## 推論補助
6262
6363
| 名前 | 説明 | 対応バージョン |
6464
|-------------------------------------------------------|------------------------------|----------------|
65-
| [`(deduction_guide)`](stride_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
65+
| [`(deduction_guide)`](stride_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
6666
6767
## 例
6868
```cpp example
@@ -75,7 +75,7 @@ int main() {
7575
7676
std::println("{}", v | std::views::stride(3));
7777
78-
for (auto&& i : v | std::views::stride(3)) {
78+
for (auto& i : v | std::views::stride(3)) {
7979
i *= 10; // 要素を書き換えても良い
8080
}
8181
std::println("{}", v);
@@ -96,8 +96,7 @@ int main() {
9696
### 処理系
9797
- [Clang](/implementation.md#clang): 16.0 [mark verified]
9898
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
99-
- [ICC](/implementation.md#icc): ??
100-
- [Visual C++](/implementation.md#visual_cpp): ??
99+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
101100

102101
## 参照
103102
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* stride_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const & requires copy_constructible<V>; // (1) C++23
10+
constexpr V base() &&; // (2) C++23
11+
```
12+
13+
## 概要
14+
15+
メンバ変数として保持している、元となるRangeを取得する。
16+
17+
## 効果
18+
19+
- (1) : `return base_;`
20+
- (2) : `return std::move(base_);`
21+
22+
##
23+
```cpp example
24+
#include <ranges>
25+
#include <vector>
26+
#include <iostream>
27+
28+
int main() {
29+
std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8};
30+
31+
std::ranges::stride_view sv{v, 3};
32+
33+
// (1) const左辺値参照版
34+
const auto& base1 = sv.base();
35+
std::cout << "base size: " << base1.size() << std::endl;
36+
37+
// (2) 右辺値参照版
38+
auto base2 = std::move(sv).base();
39+
std::cout << "moved base size: " << base2.size() << std::endl;
40+
}
41+
```
42+
* base[color ff0000]
43+
44+
### 出力
45+
```
46+
base size: 9
47+
moved base size: 9
48+
```
49+
50+
## バージョン
51+
### 言語
52+
- C++23
53+
54+
### 処理系
55+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
56+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
57+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
58+
59+
## 参照
60+
- [N4950 26.7.32 Stride view](https://timsong-cpp.github.io/cppwp/n4950/range.stride)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* stride_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>(this, ranges::begin(base_));`
23+
- (2) : `return iterator<true>(this, ranges::begin(base_));`
24+
25+
ここで、`iterator`は説明専用のイテレータクラスである。
26+
27+
## 例
28+
```cpp example
29+
#include <ranges>
30+
#include <vector>
31+
#include <print>
32+
33+
int main() {
34+
std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8};
35+
36+
std::ranges::stride_view sv{v, 3};
37+
38+
auto it = sv.begin();
39+
40+
// 最初の要素を出力
41+
std::println("first element: {}", *it);
42+
}
43+
```
44+
* begin[color ff0000]
45+
46+
### 出力
47+
```
48+
first element: 0
49+
```
50+
51+
## バージョン
52+
### 言語
53+
- C++23
54+
55+
### 処理系
56+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
57+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
58+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
59+
60+
## 参照
61+
- [N4950 26.7.32 Stride view](https://timsong-cpp.github.io/cppwp/n4950/range.stride)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* stride_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>`の場合:
23+
- (1) : `return iterator<false>(this, ranges::end(base_));`
24+
- (2) : `return iterator<true>(this, ranges::end(base_));`
25+
26+
それ以外の場合:
27+
- (1) : `return default_sentinel;`
28+
- (2) : `return default_sentinel;`
29+
30+
ここで、`iterator`は説明専用のイテレータクラスである。
31+
32+
## 例
33+
```cpp example
34+
#include <ranges>
35+
#include <vector>
36+
#include <print>
37+
38+
int main() {
39+
std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8};
40+
41+
std::ranges::stride_view sv{v, 3};
42+
43+
// イテレータ範囲で全要素を出力
44+
for (auto it = sv.begin(); it != sv.end(); ++it) {
45+
std::println("{}", *it);
46+
}
47+
}
48+
```
49+
* end[color ff0000]
50+
* begin[link begin.md]
51+
52+
### 出力
53+
```
54+
0
55+
3
56+
6
57+
```
58+
59+
## バージョン
60+
### 言語
61+
- C++23
62+
63+
### 処理系
64+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
65+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
66+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
67+
68+
## 参照
69+
- [N4950 26.7.32 Stride view](https://timsong-cpp.github.io/cppwp/n4950/range.stride)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* stride_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
stride_view()
10+
requires default_initializable<V> = default; // (1) C++23
11+
12+
constexpr explicit
13+
stride_view(V base, range_difference_t<V> stride); // (2) C++23
14+
```
15+
16+
## 概要
17+
18+
`stride_view`オブジェクトを構築する。
19+
20+
- (1) : デフォルトコンストラクタ。元となるRangeを値初期化する。
21+
- (2) : 元となるRangeと歩幅を受け取るコンストラクタ。
22+
23+
## 事前条件
24+
25+
- (2) : `stride > 0`
26+
27+
28+
## 効果
29+
30+
- (1) : `base_`と`stride_`を値初期化する。
31+
- (2) : `base_(std::move(base))`、`stride_(stride)`で初期化する。
32+
33+
ここで、`base_`は元となるRangeを保持するメンバ変数、`stride_`は歩幅を保持するメンバ変数である。
34+
35+
36+
## 例
37+
```cpp example
38+
#include <ranges>
39+
#include <vector>
40+
#include <print>
41+
42+
int main() {
43+
std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8};
44+
45+
// デフォルトコンストラクタ
46+
std::ranges::stride_view<std::views::all_t<std::vector<int>>> sv1{};
47+
48+
// 元となるRangeと歩幅を指定
49+
std::ranges::stride_view sv2{v, 3};
50+
51+
std::println("{}", sv2);
52+
}
53+
```
54+
* std::ranges::stride_view[color ff0000]
55+
* std::views::all_t[link ../all.md]
56+
57+
### 出力
58+
```
59+
[0, 3, 6]
60+
```
61+
62+
## バージョン
63+
### 言語
64+
- C++23
65+
66+
### 処理系
67+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
68+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
69+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
70+
71+
## 参照
72+
- [N4950 26.7.32 Stride view](https://timsong-cpp.github.io/cppwp/n4950/range.stride)
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+
* stride_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
namespace std::ranges {
10+
template<class R>
11+
stride_view(R&&, range_difference_t<R>) -> stride_view<views::all_t<R>>;
12+
}
13+
```
14+
15+
## 概要
16+
`stride_view`クラステンプレートの型推論補助。
17+
18+
## 例
19+
```cpp example
20+
#include <ranges>
21+
#include <vector>
22+
#include <type_traits>
23+
24+
int main() {
25+
std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8};
26+
27+
// stride_viewの型を明示的に指定する必要がない
28+
std::ranges::stride_view sv{v, 3};
29+
30+
// 推論された型を確認
31+
static_assert(std::same_as<
32+
decltype(sv),
33+
std::ranges::stride_view<std::ranges::ref_view<std::vector<int>>>
34+
>);
35+
}
36+
```
37+
* std::ranges::stride_view[color ff0000]
38+
* std::ranges::ref_view[link ../ref_view.md]
39+
40+
### 出力
41+
```
42+
```
43+
44+
## バージョン
45+
### 言語
46+
- C++23
47+
48+
### 処理系
49+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
50+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
51+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]

0 commit comments

Comments
 (0)