Skip to content

Commit 1a1278c

Browse files
committed
equal_range : C++26波カッコ初期化に対応 #1311
1 parent 8eae9db commit 1a1278c

File tree

2 files changed

+160
-10
lines changed

2 files changed

+160
-10
lines changed

reference/algorithm/equal_range.md

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,49 @@
55

66
```cpp
77
namespace std {
8-
template <class ForwardIterator, class T>
8+
template <class ForwardIterator,
9+
class T>
910
pair<ForwardIterator, ForwardIterator>
1011
equal_range(ForwardIterator first,
1112
ForwardIterator last,
1213
const T& value); // (1) C++03
13-
14-
template <class ForwardIterator, class T>
14+
template <class ForwardIterator,
15+
class T>
1516
constexpr pair<ForwardIterator, ForwardIterator>
1617
equal_range(ForwardIterator first,
1718
ForwardIterator last,
1819
const T& value); // (1) C++20
20+
template <class ForwardIterator,
21+
class T = typename iterator_traits<ForwardIterator>::value_type>
22+
constexpr pair<ForwardIterator, ForwardIterator>
23+
equal_range(ForwardIterator first,
24+
ForwardIterator last,
25+
const T& value); // (1) C++26
1926

20-
template <class ForwardIterator, class T, class Compare>
27+
template <class ForwardIterator,
28+
class T,
29+
class Compare>
2130
pair<ForwardIterator, ForwardIterator>
2231
equal_range(ForwardIterator first,
2332
ForwardIterator last,
2433
const T& value,
2534
Compare comp); // (2) C++03
26-
27-
template <class ForwardIterator, class T, class Compare>
35+
template <class ForwardIterator,
36+
class T,
37+
class Compare>
2838
constexpr pair<ForwardIterator, ForwardIterator>
2939
equal_range(ForwardIterator first,
3040
ForwardIterator last,
3141
const T& value,
3242
Compare comp); // (2) C++20
43+
template <class ForwardIterator,
44+
class T = typename iterator_traits<ForwardIterator>::value_type,
45+
class Compare>
46+
constexpr pair<ForwardIterator, ForwardIterator>
47+
equal_range(ForwardIterator first,
48+
ForwardIterator last,
49+
const T& value,
50+
Compare comp); // (2) C++26
3351
}
3452
```
3553
* pair[link /reference/utility/pair.md]
@@ -54,7 +72,17 @@ namespace std {
5472
最大で 2 * log2(`last - first`) + O(1) 回の比較を行う
5573
5674
75+
## 備考
76+
- (1), (2) :
77+
- C++26 : 引数として波カッコ初期化`{}`を受け付ける
78+
```cpp
79+
std::vector<T> v;
80+
auto result = std::equal_range(v.begin(), v.end(), {a, b});
81+
```
82+
83+
5784
## 例
85+
### 基本的な使い方
5886
```cpp example
5987
#include <iostream>
6088
#include <vector>
@@ -75,13 +103,53 @@ int main()
75103
```
76104
* equal_range[color ff0000]
77105

78-
### 出力
106+
#### 出力
79107
```
80108
3
81109
4
82110
```
83111

112+
### 波カッコ初期化を入力として使用する (C++26)
113+
```cpp example
114+
#include <algorithm>
115+
#include <iostream>
116+
#include <vector>
117+
118+
struct Point {
119+
int x;
120+
int y;
121+
122+
bool operator==(const Point& other) const = default;
123+
auto operator<=>(const Point& other) const = default;
124+
};
125+
126+
int main() {
127+
std::vector<Point> v = {
128+
{1, 2},
129+
{3, 4},
130+
{3, 4},
131+
{5, 6},
132+
};
133+
134+
// 値{3, 4}が見つかる範囲を取得
135+
auto result = std::equal_range(v.begin(), v.end(), {3, 4});
136+
137+
while (result.first != result.second) {
138+
std::cout << result.first->x << "," << result.first->y << std::endl;
139+
++result.first;
140+
}
141+
}
142+
```
143+
* std::equal_range[color ff0000]
144+
145+
#### 出力
146+
```
147+
3,4
148+
3,4
149+
```
84150
85151
## 参照
86152
- [LWG Issue 384. `equal_range` has unimplementable runtime complexity](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#384)
87153
- [P0202R3 Add Constexpr Modifiers to Functions in `<algorithm>` and `<utility>` Headers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0202r3.html)
154+
- [P2248R8 Enabling list-initialization for algorithms](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2248r8.html)
155+
- C++26で波カッコ初期化 (リスト初期化) に対応した

reference/algorithm/ranges_equal_range.md

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,55 @@ namespace std::ranges {
1010
sentinel_for<I> S,
1111
class T,
1212
class Proj = identity,
13-
indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
13+
indirect_strict_weak_order<
14+
const T*,
15+
projected<I, Proj>
16+
> Comp = ranges::less>
1417
constexpr subrange<I>
1518
equal_range(I first,
1619
S last,
1720
const T& value,
1821
Comp comp = {},
1922
Proj proj = {}); // (1) C++20
23+
template <forward_iterator I,
24+
sentinel_for<I> S,
25+
class Proj = identity,
26+
class T = projected_value_t<I, Proj>,
27+
indirect_strict_weak_order<
28+
const T*,
29+
projected<I, Proj>
30+
> Comp = ranges::less>
31+
constexpr subrange<I>
32+
equal_range(I first,
33+
S last,
34+
const T& value,
35+
Comp comp = {},
36+
Proj proj = {}); // (1) C++26
2037

2138
template <forward_range R,
2239
class T,
2340
class Proj = identity,
24-
indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = ranges::less>
41+
indirect_strict_weak_order<
42+
const T*,
43+
projected<iterator_t<R>, Proj>
44+
> Comp = ranges::less>
2545
constexpr borrowed_subrange_t<R>
2646
equal_range(R&& r,
2747
const T& value,
2848
Comp comp = {},
2949
Proj proj = {}); // (2) C++20
50+
template <forward_range R,
51+
class Proj = identity,
52+
class T = projected_value_t<iterator_t<R>, Proj>,
53+
indirect_strict_weak_order<
54+
const T*,
55+
projected<iterator_t<R>, Proj>
56+
> Comp = ranges::less>
57+
constexpr borrowed_subrange_t<R>
58+
equal_range(R&& r,
59+
const T& value,
60+
Comp comp = {},
61+
Proj proj = {}); // (2) C++26
3062
}
3163
```
3264
* forward_iterator[link /reference/iterator/forward_iterator.md]
@@ -57,11 +89,21 @@ namespace std::ranges {
5789
## 戻り値
5890
`{`[`ranges::lower_bound`](ranges_lower_bound.md)`(first, last, value, comp, proj), `[`ranges::upper_bound`](ranges_upper_bound.md)`(first, last, value, comp, proj)}`
5991
92+
6093
## 計算量
6194
最大で 2 * log2(`last - first`) + O(1) 回の比較を行う
6295
6396
97+
## 備考
98+
- (1), (2) :
99+
- C++26 : 引数として波カッコ初期化`{}`を受け付ける
100+
```cpp
101+
std::vector<T> v;
102+
auto result = std::ranges::equal_range(v, {a, b});
103+
```
104+
64105
## 例
106+
### 基本的な使い方
65107
```cpp example
66108
#include <iostream>
67109
#include <vector>
@@ -93,7 +135,7 @@ int main()
93135
* std::ranges::sort[link ranges_sort.md]
94136
* std::ranges::equal_range[color ff0000]
95137

96-
### 出力
138+
#### 出力
97139
```
98140
size: 2
99141
3
@@ -102,6 +144,44 @@ size: 2
102144
size: 0
103145
```
104146

147+
### 波カッコ初期化を入力として使用する (C++26)
148+
```cpp example
149+
#include <algorithm>
150+
#include <iostream>
151+
#include <vector>
152+
153+
struct Point {
154+
int x;
155+
int y;
156+
157+
bool operator==(const Point& other) const = default;
158+
auto operator<=>(const Point& other) const = default;
159+
};
160+
161+
int main() {
162+
std::vector<Point> v = {
163+
{1, 2},
164+
{3, 4},
165+
{3, 4},
166+
{5, 6},
167+
};
168+
169+
// 値{3, 4}が見つかる範囲を取得
170+
auto result = std::ranges::equal_range(v, {3, 4});
171+
172+
for (const Point& p : result) {
173+
std::cout << p.x << "," << p.y << std::endl;
174+
}
175+
}
176+
```
177+
* std::ranges::equal_range[color ff0000]
178+
179+
#### 出力
180+
```
181+
3,4
182+
3,4
183+
```
184+
105185
## バージョン
106186
### 言語
107187
- C++20
@@ -114,3 +194,5 @@ size: 0
114194
115195
## 参照
116196
- [N4861 25 Algorithms library](https://timsong-cpp.github.io/cppwp/n4861/algorithms)
197+
- [P2248R8 Enabling list-initialization for algorithms](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2248r8.html)
198+
- C++26で波カッコ初期化 (リスト初期化) に対応した

0 commit comments

Comments
 (0)