Skip to content

Commit 51f6075

Browse files
committed
adjacent_view #1063
1 parent 51b638c commit 51f6075

File tree

2 files changed

+115
-2
lines changed

2 files changed

+115
-2
lines changed

reference/ranges.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,8 @@ range | adaptor(args...)
353353
354354
| 名前 | 説明 | 対応バージョン |
355355
|------------------------------------------------------------------|------------------------------------------------------------------------------------|----------------|
356-
| [`adjacent_view`](ranges/adjacent_view.md.nolink) | 各要素とそれに隣接する要素を指定個数ずつ取り出した`tuple`のビュー (class template) | C++23 |
357-
| [`views::adjacent`](ranges/adjacent_view.md.nolink) | `adjacent_view`を生成する (customization point object) | C++23 |
356+
| [`adjacent_view`](ranges/adjacent_view.md) | 各要素とそれに隣接する要素を指定個数ずつ取り出した`tuple`のビュー (class template) | C++23 |
357+
| [`views::adjacent`](ranges/adjacent_view.md) | `adjacent_view`を生成する (customization point object) | C++23 |
358358
359359
### adjacent transform view
360360

reference/ranges/adjacent_view.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# adjacent_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<forward_range V, size_t N>
10+
requires view<V> && (N > 0)
11+
class adjacent_view : public view_interface<adjacent_view<V, N>> {…… }; // (1)
12+
13+
namespace views {
14+
inline constexpr /*unspecified*/ adjacent = /*unspecified*/; // (2)
15+
}
16+
}
17+
```
18+
19+
## 概要
20+
21+
`adjacent_view`は各要素とそれに隣接する要素を指定個数ずつ取り出した[`tuple`](/reference/tuple/tuple.md)を要素とする[`view`](view.md)。
22+
23+
`adjacent_view`の要素を1つ取得するごとに、`V` の要素を `N` 個取得する。
24+
25+
`N` が元となるRangeの要素数より大きい場合、この[`view`](view.md)は空である。
26+
27+
- (1): `adjacent_view`のクラス定義
28+
- (2): `adjacent_view`を生成するカスタマイゼーションポイントオブジェクト(Rangeアダプタオブジェクトではない)
29+
30+
### Rangeコンセプト
31+
32+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
33+
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
34+
| | (1) | 〇 | 〇 | (1) | (1) | (1) | | (1) | ○ | ○ |
35+
36+
- (1): 元となるRangeに従う
37+
38+
## 効果
39+
40+
- (2): 式`views::adjacent<N>(E)`の効果は次の通り
41+
- `N` > 0 のとき、`adjacent_view<`[`views::all_t`](all.md)`<decltype((E))>, N>(E)` と等しい
42+
- `N` = 0 のとき、`auto((void)E, `[`views::empty`](empty_view.md)`<`[`tuple`](/reference/tuple/tuple.md)`<>>))` と等しい
43+
44+
45+
## メンバ関数
46+
47+
| 名前 | 説明 | 対応バージョン |
48+
|-----------------------------------------------------|----------------------------------|----------------|
49+
| [`(constructor)`](adjacent_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
50+
| [`base`](take_view/base.md.nolink) | `V`の参照を取得する | C++23 |
51+
| [`begin`](adjacent_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
52+
| [`end`](adjacent_view/end.md.nolink) | 番兵を取得する | C++23 |
53+
| [`size`](take_view/size.md.nolink) | 要素数を取得する | C++23 |
54+
55+
## 継承しているメンバ関数
56+
57+
| 名前 | 説明 | 対応バージョン |
58+
|----------------------------------------------|-----------------------------------|----------------|
59+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
60+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
61+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
62+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
63+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
64+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
65+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
66+
67+
## 推論補助
68+
69+
| 名前 | 説明 | 対応バージョン |
70+
|-------------------------------------------------------|------------------------------|----------------|
71+
| [`(deduction_guide)`](adjacent_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
72+
73+
## 例
74+
```cpp example
75+
#include <ranges>
76+
#include <vector>
77+
#include <print>
78+
79+
int main() {
80+
std::vector v = {1, 2, 3, 4, 5, 6};
81+
std::println("{}", v | std::views::adjacent<0>);
82+
std::println("{}", v | std::views::adjacent<1>);
83+
std::println("{}", v | std::views::adjacent<3>);
84+
std::println("{}", v | std::views::adjacent<6>);
85+
std::println("{}", v | std::views::adjacent<7>);
86+
}
87+
```
88+
* std::views::adjacent[color ff0000]
89+
90+
### 出力
91+
```
92+
[]
93+
[(1), (2), (3), (4), (5), (6)]
94+
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
95+
[(1, 2, 3, 4, 5, 6)]
96+
[]
97+
```
98+
99+
## バージョン
100+
### 言語
101+
- C++23
102+
103+
### 処理系
104+
- [Clang](/implementation.md#clang): ??
105+
- [GCC](/implementation.md#gcc): ??
106+
- [ICC](/implementation.md#icc): ??
107+
- [Visual C++](/implementation.md#visual_cpp): ??
108+
109+
## 関連項目
110+
- [`adjacent_transform_view`](adjacent_transform_view.md.nolink) `adjacent_view` と同じように要素を取得して関数を適用する
111+
112+
## 参照
113+
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)

0 commit comments

Comments
 (0)