Skip to content

Commit 0f3ab3a

Browse files
committed
algorithm/find : C++26の波カッコ初期化対応 #1311
1 parent e36b137 commit 0f3ab3a

File tree

6 files changed

+233
-17
lines changed

6 files changed

+233
-17
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
* <functional>[link /reference/functional.md]
128128
* identity[link /reference/functional/identity.md]
129129
* ranges::equal_to[link /reference/functional/ranges_equal_to.md]
130+
* std::identity[link /reference/functional/identity.md]
130131
* <future>[link /reference/future.md]
131132
* <generator>[link /reference/generator.md]
132133
* <initializer_list>[link /reference/initializer_list.md]
@@ -155,6 +156,7 @@
155156
* iter_value_t[link /reference/iterator/iter_value_t.md]
156157
* output_iterator[link /reference/iterator/output_iterator.md]
157158
* projected[link /reference/iterator/projected.md]
159+
* projected_value_t[link /reference/iterator/projected_value_t.md]
158160
* random_access_iterator[link /reference/iterator/random_access_iterator.md]
159161
* sentinel_for[link /reference/iterator/sentinel_for.md]
160162
* std::back_inserter[link /reference/iterator/back_inserter.md]

reference/algorithm/find.md

Lines changed: 82 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,41 @@
55

66
```cpp
77
namespace std {
8-
template <class InputIterator, class T>
9-
InputIterator find(InputIterator first,
10-
InputIterator last,
11-
const T& value); // (1) C++03
12-
13-
template <class InputIterator, class T>
14-
constexpr InputIterator find(InputIterator first,
15-
InputIterator last,
16-
const T& value); // (1) C++20
17-
18-
template<class ExecutionPolicy, class ForwardIterator, class T>
19-
ForwardIterator find(ExecutionPolicy&& exec,
20-
ForwardIterator first,
21-
ForwardIterator last,
22-
const T& value); // (2) C++17
8+
template <class InputIterator,
9+
class T>
10+
InputIterator
11+
find(InputIterator first,
12+
InputIterator last,
13+
const T& value); // (1) C++03
14+
template <class InputIterator,
15+
class T>
16+
constexpr InputIterator
17+
find(InputIterator first,
18+
InputIterator last,
19+
const T& value); // (1) C++20
20+
template <class InputIterator,
21+
class T = typename iterator_traits<InputIterator>::value_type>
22+
constexpr InputIterator
23+
find(InputIterator first,
24+
InputIterator last,
25+
const T& value); // (1) C++26
26+
27+
template<class ExecutionPolicy,
28+
class ForwardIterator,
29+
class T>
30+
ForwardIterator
31+
find(ExecutionPolicy&& exec,
32+
ForwardIterator first,
33+
ForwardIterator last,
34+
const T& value); // (2) C++17
35+
template<class ExecutionPolicy,
36+
class ForwardIterator,
37+
class T = typename iterator_traits<InputIterator>::value_type>
38+
ForwardIterator
39+
find(ExecutionPolicy&& exec,
40+
ForwardIterator first,
41+
ForwardIterator last,
42+
const T& value); // (2) C++26
2343
}
2444
```
2545
@@ -35,7 +55,16 @@ namespace std {
3555
最大で `last - first` 回比較を行う
3656
3757
58+
## 備考
59+
- (1), (2) :
60+
- C++26 : 引数として波カッコ初期化`{}`を受け付ける
61+
```cpp
62+
std::vector<T> v;
63+
auto it = std::find(v.begin(), v.begin(), {a, b});
64+
```
65+
3866
## 例
67+
### 基本的な使い方
3968
```cpp example
4069
#include <algorithm>
4170
#include <iostream>
@@ -53,11 +82,46 @@ int main() {
5382
```
5483
* std::find[color ff0000]
5584

56-
### 出力
85+
#### 出力
5786
```
5887
found: 1
5988
```
6089

90+
### 波カッコ初期化を入力として使用する (C++26)
91+
```cpp example
92+
#include <algorithm>
93+
#include <iostream>
94+
#include <vector>
95+
96+
struct Point {
97+
int x;
98+
int y;
99+
100+
bool operator==(const Point& other) const = default;
101+
};
102+
103+
int main() {
104+
std::vector<Point> v = {
105+
{1, 2},
106+
{3, 4},
107+
{5, 6}
108+
};
109+
110+
auto it = std::find(v.begin(), v.end(), {3, 4});
111+
if (it == v.end()) {
112+
std::cout << "not found" << std::endl;
113+
} else {
114+
std::cout << "found: " << it->x << "," << it->y << std::endl;
115+
}
116+
}
117+
```
118+
* std::find[color ff0000]
119+
120+
#### 出力
121+
```
122+
found: 3,4
123+
```
124+
61125
62126
## 実装例
63127
```cpp
@@ -73,3 +137,5 @@ InputIterator find(InputIterator first, InputIterator last, const T& value) {
73137
## 参照
74138
- [P0202R3 Add Constexpr Modifiers to Functions in `<algorithm>` and `<utility>` Headers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0202r3.html)
75139
- [P0467R2 Iterator Concerns for Parallel Algorithms](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0467r2.html)
140+
- [P2248R8 Enabling list-initialization for algorithms](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2248r8.html)
141+
- C++26で波カッコ初期化 (リスト初期化) に対応した

reference/algorithm/ranges_find.md

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ namespace std::ranges {
1616
S last,
1717
const T& value,
1818
Proj proj = {}); // (1) C++20
19+
template <input_iterator I,
20+
sentinel_for<I> S,
21+
class Proj = identity,
22+
class T = projected_value_t<I, Proj>>
23+
requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
24+
constexpr I
25+
find(I first,
26+
S last,
27+
const T& value,
28+
Proj proj = {}); // (1) C++26
1929

2030
template <input_range R,
2131
class T,
@@ -25,6 +35,14 @@ namespace std::ranges {
2535
find(R&& r,
2636
const T& value,
2737
Proj proj = {}); // (2) C++20
38+
template <input_range R,
39+
class Proj = identity,
40+
class T = projected_value_t<iterator_t<R>, Proj>>
41+
requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
42+
constexpr borrowed_iterator_t<R>
43+
find(R&& r,
44+
const T& value,
45+
Proj proj = {}); // (2) C++26
2846
}
2947
```
3048
* input_iterator[link /reference/iterator/input_iterator.md]
@@ -51,7 +69,17 @@ namespace std::ranges {
5169
最大で `last - first` 回比較を行う
5270
5371
72+
## 備考
73+
- (1), (2) :
74+
- C++26 : 引数として波カッコ初期化`{}`を受け付ける
75+
```cpp
76+
std::vector<T> v;
77+
auto it = std::ranges::find(r, {a, b});
78+
```
79+
80+
5481
## 例
82+
### 基本的な使い方
5583
```cpp example
5684
#include <algorithm>
5785
#include <iostream>
@@ -69,11 +97,46 @@ int main() {
6997
```
7098
* std::ranges::find[color ff0000]
7199

72-
### 出力
100+
#### 出力
73101
```
74102
found: 1
75103
```
76104

105+
### 波カッコ初期化を入力として使用する (C++26)
106+
```cpp example
107+
#include <algorithm>
108+
#include <iostream>
109+
#include <vector>
110+
111+
struct Point {
112+
int x;
113+
int y;
114+
115+
bool operator==(const Point& other) const = default;
116+
};
117+
118+
int main() {
119+
std::vector<Point> v = {
120+
{1, 2},
121+
{3, 4},
122+
{5, 6}
123+
};
124+
125+
auto it = std::ranges::find(v, {3, 4});
126+
if (it == v.end()) {
127+
std::cout << "not found" << std::endl;
128+
} else {
129+
std::cout << "found: " << it->x << "," << it->y << std::endl;
130+
}
131+
}
132+
```
133+
* std::ranges::find[color ff0000]
134+
135+
#### 出力
136+
```
137+
found: 3,4
138+
```
139+
77140
78141
## 実装例
79142
```cpp
@@ -120,3 +183,5 @@ inline constexpr find_impl find;
120183

121184
## 参照
122185
- [N4861 25 Algorithms library](https://timsong-cpp.github.io/cppwp/n4861/algorithms)
186+
- [P2248R8 Enabling list-initialization for algorithms](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2248r8.html)
187+
- C++26で波カッコ初期化 (リスト初期化) に対応した

reference/iterator.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ C++20以降の標準ライブラリでは、任意のイテレータに対して
8181
| [`iter_const_reference_t`](iterator/iter_const_reference_t.md) | イテレータの参照型(`iter_reference_t`)を`const`化したものを取得する (alias template) | C++23 |
8282
| [`indirect_result_t`](iterator/indirect_result_t.md) | 関数呼び出し可能な型`F`を複数のイテレータ`Is...`によって呼び出した時の戻り値型を取得する (alias template) | C++20 |
8383
| [`projected`](iterator/projected.md) | イテレータ`I``Proj`による射影操作の結果を表すことのできる[`indirectly_readable`](/reference/iterator/indirectly_readable.md)なクラス (class template) | C++20 |
84+
| [`projected_value_t`](iterator/projected_value_t.md) | イイテレータ`I``Proj`による射影操作の結果となる値型を取得する (alias template) | C++26 |
8485
| [`incrementable_traits`](iterator/incrementable_traits.md) | `iter_difference_t`にアダプトするためのカスタマイゼーションポイント (class template) | C++20 |
8586
| [`indirectly_readable_traits`](iterator/indirectly_readable_traits.md) | `iter_value_t`にアダプトするためのカスタマイゼーションポイント (class template) | C++20 |
8687
| [`input_iterator_tag`](iterator/iterator_tag.md) | 入力イテレータを表すタグ(class) | |

reference/iterator/projected.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ int main() {
8787

8888
## 関連項目
8989

90+
- [`projected_value_t`](projected_value_t.md)
9091
- [`indirectly_comparable`](indirectly_comparable.md)
9192
- [`mergeable`](mergeable.md)
9293
- [`sortable`](sortable.md)
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# projected_value_t
2+
* iterator[meta header]
3+
* std[meta namespace]
4+
* type-alias[meta id-type]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std {
9+
template <indirectly_­readable I,
10+
indirectly_­regular_­unary_­invocable<I> Proj>
11+
using projected_value_t = remove_cvref_t<invoke_result_t<Proj&, iter_value_t<I>&>>;
12+
}
13+
```
14+
* indirectly_readable[link /reference/iterator/indirectly_readable.md]
15+
* indirectly_­regular_­unary_­invocable[link /reference/iterator/indirectly_­regular_­unary_­invocable.md.nolink]
16+
17+
## 概要
18+
イテレータ型`I`が指す値型を取得する。
19+
20+
この型は、間接参照可能な型`I`に任意の射影操作`Proj`を適用した結果となる値型を返す。
21+
22+
23+
## 例
24+
```cpp example
25+
#include <concepts>
26+
#include <iterator>
27+
#include <functional>
28+
#include <vector>
29+
30+
int main() {
31+
using vec_iterator = std::vector<int>::iterator;
32+
using pointer = double*;
33+
34+
static_assert(std::same_as<
35+
std::projected_value_t<vec_iterator, std::identity>,
36+
int
37+
>);
38+
39+
static_assert(std::same_as<
40+
std::projected_value_t<pointer, std::identity>,
41+
double
42+
>);
43+
}
44+
```
45+
* std::projected_value_t[color ff0000]
46+
47+
### 出力
48+
```
49+
```
50+
51+
## バージョン
52+
### 言語
53+
- C++26
54+
55+
### 処理系
56+
- [Clang](/implementation.md#clang): 21 [mark verified]
57+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
58+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 13 [mark noimpl]
59+
60+
61+
## 関連項目
62+
- [`std::projected`](projected.md)
63+
- [`std::ranges::find()`](/reference/algorithm/ranges_find.md)
64+
- [`std::ranges::find_last()`](/reference/algorithm/ranges_find_last.md)
65+
- [`std::ranges::count()`](/reference/algorithm/ranges_count.md)
66+
- [`std::ranges::search_n()`](/reference/algorithm/ranges_search_n.md)
67+
- [`std::ranges::replace()`](/reference/algorithm/ranges_replace.md)
68+
- [`std::ranges::replace_if()`](/reference/algorithm/ranges_replace_if.md)
69+
- [`std::ranges::replace_copy()`](/reference/algorithm/replace_copy.md)
70+
- [`std::ranges::remove()`](/reference/algorithm/ranges_remove.md)
71+
- [`std::ranges::remove_copy()`](/reference/algorithm/ranges_remove_copy.md)
72+
- [`std::ranges::lower_bound()`](/reference/algorithm/ranges_lower_bound.md)
73+
- [`std::ranges::upper_bound()`](/reference/algorithm/ranges_upper_bound.md)
74+
- [`std::ranges::equal_range()`](/reference/algorithm/ranges_equal_range.md)
75+
- [`std::ranges::binary_search()`](/reference/algorithm/ranges_binary_search.md)
76+
- [`std::ranges::contains()`](/reference/algorithm/ranges_contains.md)
77+
78+
79+
## 参照
80+
- [P2248R8 Enabling list-initialization for algorithms](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2248r8.html)
81+
- C++26で、アルゴリズムに波カッコ初期化 (リスト初期化) を渡せるようにするために導入された。`find(r, {1, 2});`

0 commit comments

Comments
 (0)