55
66``` cpp
77namespace 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```
911142,3,2,
92115size before: 5
93116size 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