Skip to content

Commit b810699

Browse files
committed
algorithm/remove : C++26波カッコ初期化に対応 #1311
1 parent e463c2f commit b810699

File tree

2 files changed

+149
-14
lines changed

2 files changed

+149
-14
lines changed

reference/algorithm/ranges_remove.md

Lines changed: 76 additions & 5 deletions
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 <permutable 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 subrange<I>
25+
remove(I first,
26+
S last,
27+
const T& value,
28+
Proj proj = {}); // (1) C++26
1929

2030
template <forward_range R,
2131
class T,
@@ -30,6 +40,19 @@ namespace std::ranges {
3040
remove(R&& r,
3141
const T& value,
3242
Proj proj = {}); // (2) C++20
43+
template <forward_range R,
44+
class Proj = identity,
45+
class T = projected_value_t<iterator_t<R>, Proj>>
46+
requires permutable<iterator_t<R>> &&
47+
indirect_binary_predicate<
48+
ranges::equal_to,
49+
projected<iterator_t<R>, Proj>,
50+
const T*
51+
>
52+
constexpr borrowed_subrange_t<R>
53+
remove(R&& r,
54+
const T& value,
55+
Proj proj = {}); // (2) C++26
3356
}
3457
```
3558
* permutable[link /reference/iterator/permutable.md]
@@ -67,12 +90,18 @@ namespace std::ranges {
6790
6891
6992
## 備考
70-
有効な要素を範囲の前方に集める処理には、ムーブを使用する。
71-
72-
取り除いた要素の先頭を指すイテレータを`ret`とし、範囲`[ret, last)`の各要素には、有効な要素からムーブされた値が設定される。それらの値は、「有効だが未規定な値」となる。
93+
- 有効な要素を範囲の前方に集める処理には、ムーブが使用される
94+
- 取り除いた要素の先頭を指すイテレータを`ret`とし、範囲`[ret, last)`の各要素には、有効な要素からムーブされた値が設定される。それらの値は、「有効だが未規定な値」となる
95+
- (1), (2) :
96+
- C++26 : 引数として波カッコ初期化`{}`を受け付ける
97+
```cpp
98+
std::vector<T> v;
99+
auto sr = std::ranges::remove(v, {a, b});
100+
```
73101
74102
75103
## 例
104+
### 基本的な使い方
76105
```cpp example
77106
#include <algorithm>
78107
#include <iostream>
@@ -101,17 +130,57 @@ int main() {
101130
```
102131
* result[color ff0000]
103132
* std::ranges::remove[color ff0000]
104-
* v.erase[color ff0000][link /reference/vector/vector/erase.md]
133+
* v.erase[link /reference/vector/vector/erase.md]
105134
* std::ranges::subrange[link /reference/ranges/subrange.md]
106135
* Erase-remove イディオム[link https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%B6%88%E5%8E%BB%E3%83%BB%E5%89%8A%E9%99%A4(Erase-Remove)]
107136

108-
### 出力
137+
#### 出力
109138
```
110139
2,3,2,
111140
size before: 5
112141
size after: 3
113142
```
114143

144+
### 波カッコ初期化を入力として使用する (C++26)
145+
```cpp example
146+
#include <algorithm>
147+
#include <iostream>
148+
#include <vector>
149+
150+
struct Point {
151+
int x;
152+
int y;
153+
154+
bool operator==(const Point& other) const = default;
155+
};
156+
157+
int main() {
158+
std::vector<Point> v = {
159+
{1, 2},
160+
{3, 4},
161+
{5, 6},
162+
{1, 2},
163+
};
164+
165+
// 値{1, 2}を除去する
166+
std::ranges::subrange sr = std::ranges::remove(v, {1, 2});
167+
v.erase(sr.begin(), v.end());
168+
169+
for (const Point& p : v) {
170+
std::cout << p.x << "," << p.y << std::endl;
171+
}
172+
}
173+
```
174+
* std::ranges::remove[color ff0000]
175+
* v.erase[link /reference/vector/vector/erase.md]
176+
* std::ranges::subrange[link /reference/ranges/subrange.md]
177+
178+
#### 出力
179+
```
180+
3,4
181+
5,6
182+
```
183+
115184
## バージョン
116185
### 言語
117186
- C++20
@@ -124,3 +193,5 @@ size after: 3
124193
125194
## 参照
126195
- [N4861 25 Algorithms library](https://timsong-cpp.github.io/cppwp/n4861/algorithms)
196+
- [P2248R8 Enabling list-initialization for algorithms](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2248r8.html)
197+
- C++26で波カッコ初期化 (リスト初期化) に対応した

reference/algorithm/remove.md

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,41 @@
55

66
```cpp
77
namespace std {
8-
template <class ForwardIterator, class T>
8+
template <class ForwardIterator,
9+
class T>
910
ForwardIterator
1011
remove(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 ForwardIterator
1617
remove(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 ForwardIterator
23+
remove(ForwardIterator first,
24+
ForwardIterator last,
25+
const T& value); // (1) C++26
1926

20-
template <class ExecutionPolicy, class ForwardIterator, class T>
27+
template <class ExecutionPolicy,
28+
class ForwardIterator,
29+
class T>
2130
ForwardIterator
2231
remove(ExecutionPolicy&& exec,
2332
ForwardIterator first,
2433
ForwardIterator last,
2534
const T& value); // (2) C++17
35+
template <class ExecutionPolicy,
36+
class ForwardIterator,
37+
class T = typename iterator_traits<ForwardIterator>::value_type>
38+
ForwardIterator
39+
remove(ExecutionPolicy&& exec,
40+
ForwardIterator first,
41+
ForwardIterator last,
42+
const T& value); // (2) C++26
2643
}
2744
```
2845
@@ -51,12 +68,18 @@ namespace std {
5168
5269
5370
## 備考
54-
有効な要素を範囲の前方に集める処理には、ムーブを使用する。
55-
56-
取り除いた要素の先頭を指すイテレータを`ret`とし、範囲`[ret, last)`の各要素には、有効な要素からムーブされた値が設定される。それらの値は、「有効だが未規定な値」となる。
71+
- 有効な要素を範囲の前方に集める処理には、ムーブが使用される
72+
- 取り除いた要素の先頭を指すイテレータを`ret`とし、範囲`[ret, last)`の各要素には、有効な要素からムーブされた値が設定される。それらの値は、「有効だが未規定な値」となる
73+
- (1), (2) :
74+
- C++26 : 引数として波カッコ初期化`{}`を受け付ける
75+
```cpp
76+
std::vector<T> v;
77+
auto it = std::remove(v.begin(), v.end(), {a, b});
78+
```
5779
5880
5981
## 例
82+
### 基本的な使い方
6083
```cpp example
6184
#include <algorithm>
6285
#include <iostream>
@@ -83,16 +106,55 @@ int main() {
83106
```
84107
* result[color ff0000]
85108
* std::remove[color ff0000]
86-
* v.erase[color ff0000][link /reference/vector/vector/erase.md]
109+
* v.erase[link /reference/vector/vector/erase.md]
87110
* Erase-remove イディオム[link https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%B6%88%E5%8E%BB%E3%83%BB%E5%89%8A%E9%99%A4(Erase-Remove)]
88111

89-
### 出力
112+
#### 出力
90113
```
91114
2,3,2,
92115
size before: 5
93116
size after: 3
94117
```
95118

119+
### 波カッコ初期化を入力として使用する (C++26)
120+
```cpp example
121+
#include <algorithm>
122+
#include <iostream>
123+
#include <vector>
124+
125+
struct Point {
126+
int x;
127+
int y;
128+
129+
bool operator==(const Point& other) const = default;
130+
};
131+
132+
int main() {
133+
std::vector<Point> v = {
134+
{1, 2},
135+
{3, 4},
136+
{5, 6},
137+
{1, 2},
138+
};
139+
140+
// 値{1, 2}を除去する
141+
auto it = std::remove(v.begin(), v.end(), {1, 2});
142+
v.erase(it, v.end());
143+
144+
for (const Point& p : v) {
145+
std::cout << p.x << "," << p.y << std::endl;
146+
}
147+
}
148+
```
149+
* std::remove[color ff0000]
150+
* v.erase[link /reference/vector/vector/erase.md]
151+
152+
#### 出力
153+
```
154+
3,4
155+
5,6
156+
```
157+
96158
97159
## 実装例
98160
```cpp
@@ -113,3 +175,5 @@ ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& val
113175
- [LWG Issue 2110. `remove` can't swap but note says it might](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2110)
114176
- C++11までのこのアルゴリズムは、要素の移動にswap操作が行われるかもしれない、と書いていた。だが、このアルゴリズムの要件は`MoveAssignable`のみであるため、swapはできない。そのため、C++14からは、ムーブのみで要素の移動が行われるようになった。
115177
- [P0202R3 Add Constexpr Modifiers to Functions in `<algorithm>` and `<utility>` Headers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0202r3.html)
178+
- [P2248R8 Enabling list-initialization for algorithms](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2248r8.html)
179+
- C++26で波カッコ初期化 (リスト初期化) に対応した

0 commit comments

Comments
 (0)