GeezerVison is showing cpprefjp.github.io — std::remove - cpprefjp C++日本語リファレンス
最終更新日時:
2026年08月25日 12時11分17秒 (JST)
Akira Takahashi
が更新
履歴
編集
function template
<algorithm>
std:: remove
namespace std {
template < class ForwardIterator ,
class T >
ForwardIterator
remove ( ForwardIterator first ,
ForwardIterator last ,
const T & value ); // (1) C++98
template < class ForwardIterator ,
class T >
constexpr ForwardIterator
remove ( ForwardIterator first ,
ForwardIterator last ,
const T & value ); // (1) C++20
template < class ForwardIterator ,
class T = typename iterator_traits < ForwardIterator >:: value_type >
constexpr ForwardIterator
remove ( ForwardIterator first ,
ForwardIterator last ,
const T & value ); // (1) C++26
template < class ExecutionPolicy ,
class ForwardIterator ,
class T >
ForwardIterator
remove ( ExecutionPolicy && exec ,
ForwardIterator first ,
ForwardIterator last ,
const T & value ); // (2) C++17
template < class ExecutionPolicy ,
class ForwardIterator ,
class T = typename iterator_traits < ForwardIterator >:: value_type >
ForwardIterator
remove ( ExecutionPolicy && exec ,
ForwardIterator first ,
ForwardIterator last ,
const T & value ); // (2) C++26
}
概要
イテレータ範囲[first, last)から指定された要素を取り除く。
テンプレートパラメータ制約
*first の型は MoveAssignable の要件を満たすこと
効果
[first,last) 内にあるイテレータ i について、*i == value である要素を取り除き、有効な要素を範囲の前に寄せる。
戻り値
有効な要素の末尾の次を指すイテレータを返す。
計算量
正確に last - first 回の比較を行う
注意
安定。
備考
有効な要素を範囲の前方に集める処理には、ムーブが使用される
取り除いた要素の先頭を指すイテレータをretとし、範囲[ret, last)の各要素には、有効な要素からムーブされた値が設定される。それらの値は、「有効だが未規定 な値」となる
(1), (2) :
C++26 : 引数として波カッコ初期化{}を受け付ける
例
基本的な使い方
#include <algorithm>
#include <iostream>
#include <vector>
int main () {
std::vector < int > v = { 2 , 3 , 1 , 2 , 1 };
auto result = std::remove ( v.begin() , v.end() , 1 );
// [v.begin() ,result ) の範囲に 1 を除去した結果が入っている
std::for_each ( v.begin() , result , []( int x ) { std::cout << x << "," ; });
std::cout << std::endl ;
// remove を使ってもコンテナの要素数は変わらないことに注意しよう
std::cout << "size before: " << v.size() << std::endl ;
// [v.begin() ,result ) の範囲に 1 を除去した結果が入っているので、
// [result ,v.end() ) を erase することでサイズも変更することができる
// (Erase-remove イディオム )
v.erase ( result , v.end() );
std::cout << "size after: " << v.size() << std::endl ;
}
出力
2,3,2,
size before: 5
size after: 3
波カッコ初期化を入力として使用する (C++26)
#include <algorithm>
#include <iostream>
#include <vector>
struct Point {
int x ;
int y ;
bool operator == ( const Point & other ) const = default ;
};
int main () {
std::vector < Point > v = {
{ 1 , 2 },
{ 3 , 4 },
{ 5 , 6 },
{ 1 , 2 },
};
// 値{1, 2}を除去する
auto it = std::remove ( v.begin() , v.end() , { 1 , 2 });
v.erase ( it , v.end() );
for ( const Point & p : v ) {
std::cout << p . x << "," << p . y << std::endl ;
}
}
出力
3,4
5,6
実装例
template < class ForwardIterator , class T >
ForwardIterator remove ( ForwardIterator first , ForwardIterator last , const T & value ) {
auto result = first ;
for ( ; first != last ; ++ first )
if ( ! ( * first == value ))
* result ++ = std::move ( * first );
return result ;
}
関連項目
参照