Skip to content

Commit 5bd194c

Browse files
committed
ranges : to_input_viewのクラスページを作成 #1423
1 parent 0923d23 commit 5bd194c

File tree

3 files changed

+152
-1
lines changed

3 files changed

+152
-1
lines changed

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
167167
- [`std::span`](/reference/span/span.md)[`std::mdspan`](/reference/mdspan/mdspan.md)の推論補助を改善
168168
- [`std::views::concat`](/reference/ranges/concat_view.md)を追加
169169
- [`std::views::cache_latest`](/reference/ranges/cache_latest.md.nolink)を追加
170-
- [`std::views::to_input`](/reference/ranges/to_input_view.md.nolink)を追加。書き換えできない入力専用の値に変換する
170+
- [`std::views::to_input`](/reference/ranges/to_input_view.md)を追加。これはパフォーマンス向上のために、Rangeを入力Rangeかつ非[`common_range`](/reference/ranges/common_range.md) (イテレータと番兵の型を別する) に変換する
171171
- Range関係の、償却定数時間での要素追加を行う機能を追加
172172
- 各viewクラスに`reserve_hint()`メンバ関数を追加
173173
- [`std::ranges::reserve_hint()`](/reference/ranges/reserve_hint.md.nolink)関数を追加

reference/ranges.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,14 @@ range | adaptor(args...)
427427
| [`views::cartesian_product`](ranges/cartesian_product_view.md) | `cartesian_product_view`を生成する (customization point object) | C++23 |
428428
429429
430+
### to input view
431+
432+
| 名前 | 説明 | 対応バージョン |
433+
|------|------|----------------|
434+
| [`to_input_view`](ranges/to_input_view.md) | 入力用Rangeに変換する (class template) | C++26 |
435+
| [`views::to_input`](ranges/to_input_view.md) | `to_input_view`を生成する (customization point object) | C++26 |
436+
437+
430438
## Range変換
431439
432440
| 名前 | 説明 | 対応バージョン |

reference/ranges/to_input_view.md

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# to_input_view
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* class template[meta id-type]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<input_range V>
10+
requires view<V>
11+
class to_input_view : public view_interface<to_input_view<V>> { …… }; // (1)
12+
13+
namespace views {
14+
inline constexpr /*unspecified*/ to_input = /*unspecified*/; // (2)
15+
}
16+
}
17+
```
18+
* view[link view.md]
19+
* view_interface[link view_interface.md]
20+
21+
## 概要
22+
- (1): [`input_range`](/reference/ranges/input_range.md)として振る舞う[`view`](view.md)
23+
- (2): `to_input_view`を生成するRangeアダプタオブジェクト
24+
25+
この`view`は、Rangeを`input_range`に変換し、非[`common_range`](common_range.md)にする (イテレータと番兵の型を別にする)。
26+
27+
この`view`は、パフォーマンス向上のために使用する。以下に例示する:
28+
29+
- [`views::join`](join_view.md)`(r)`は、`r`が[`common_range`](common_range.md) (イテレータと番兵の型が同じRange) である場合、イテレータと番兵の比較のために外側と内側の2種類のイテレータを順番に比較することになり比較コストが高くなる。`to_input`を使用することで、番兵との比較が一回で済むためにイテレータの比較コストが小さくなり、パフォーマンス向上が見込める
30+
- [`views::chunk`](chunk_view.md)の場合、`r | views::chunk(n)`は`r`が[`forward_range`](forward_range.md)以上である場合に各要素が[`views::take`](take_view.md)`(n)`となり、各要素を2回ずつイテレートすることになる。[`input_range`](input_range.md)に変換することで、各要素を1回ずつイテレートすることになり、パフォーマンス向上が見込める
31+
32+
33+
### Rangeコンセプト
34+
35+
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
36+
|:--------:|:-----:|:------:|:-----:|:-------:|:-------------:|:-------------:|:----------:|:------:|:--------:|:----:|
37+
| ※ | ※ | | ○ | | | | ※ | | ○ | ○ |
38+
39+
- ※: `V`に従う
40+
41+
## 効果
42+
43+
- (2): 式`views::to_input(E)`の効果は次のいずれか(`T = decltype((E))`、`U = remove_cvref_t<T>`とする)
44+
- `T`が[`input_range`](input_range.md)のモデルであり、[`common_range`](common_range.md)を満たさず、[`forward_range`](forward_range.md)も満たさない場合 : `views::all(E)`
45+
- それ以外の場合 : `to_input_view(E)`
46+
47+
## メンバ関数
48+
49+
| 名前 | 説明 | 対応バージョン |
50+
|--------------------------------------------------|----------------------------------|----------------|
51+
| [`(constructor)`](to_input_view/op_constructor.md.nolink) | コンストラクタ | C++26 |
52+
| [`base`](to_input_view/base.md.nolink) | `V`の参照を取得する | C++26 |
53+
| [`begin`](to_input_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++26 |
54+
| [`end`](to_input_view/end.md.nolink) | 番兵を取得する | C++26 |
55+
| [`size`](to_input_view/size.md.nolink) | 要素数を取得する | C++26 |
56+
57+
## 継承しているメンバ関数
58+
59+
| 名前 | 説明 | 対応バージョン |
60+
|----------------------------------------------|-----------------------------------|----------------|
61+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++26 |
62+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++26 |
63+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++26 |
64+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++26 |
65+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++26 |
66+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++26 |
67+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++26 |
68+
69+
## 推論補助
70+
71+
| 名前 | 説明 | 対応バージョン |
72+
|-------------------------------------------------------|------------------------------|----------------|
73+
| [`(deduction_guide)`](to_input_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++26 |
74+
75+
## 例
76+
### 基本的な使い方
77+
```cpp example
78+
#include <ranges>
79+
#include <iostream>
80+
#include <vector>
81+
82+
int main() {
83+
std::vector<int> v = {1, 2, 3, 4};
84+
85+
for (auto i : v | std::views::to_input) {
86+
std::cout << i << ' ';
87+
}
88+
}
89+
```
90+
* views::to_input[color ff0000]
91+
92+
#### 出力
93+
```
94+
1 2 3 4
95+
```
96+
97+
### viewをパフォーマンス向上させる
98+
```cpp example
99+
#include <ranges>
100+
#include <iostream>
101+
#include <vector>
102+
103+
int main() {
104+
std::vector<std::vector<int>> v1 = {{1, 2}, {3, 4}};
105+
106+
// `v1 | std::views::join`と比較して、イテレータと番兵の比較コストが低くなり、
107+
// パフォーマンスが向上する
108+
for (auto i : v1 | std::views::to_input | std::views::join) {
109+
std::cout << i << ' ';
110+
}
111+
112+
// `v2 | std::views::chunk(3)`と比較して、各要素が1回ずつイテレートで済むため、
113+
// パフォーマンスが向上する
114+
std::vector v2 = {1, 2, 3, 4, 5, 6};
115+
for (const auto& v : v2 | std::views::to_input | std::views::chunk(3)) {
116+
for (const auto& i : v) {
117+
std::cout << i << ' ';
118+
}
119+
std::cout << std::endl;
120+
}
121+
}
122+
```
123+
* views::to_input[color ff0000]
124+
* std::views::join[link join_view.md]
125+
* std::views::chunk[link chunk_view.md]
126+
127+
#### 出力
128+
```
129+
1 2 3 4 1 2 3
130+
4 5 6
131+
```
132+
133+
## バージョン
134+
### 言語
135+
- C++26
136+
137+
### 処理系
138+
- [Clang](/implementation.md#clang): 21 [mark verified]
139+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
140+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
141+
142+
## 参照
143+
- [P3137R3 `views::to_input`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3137r3.html)

0 commit comments

Comments
 (0)