C++標準ライブラリ---シリアルコンテナの除去アルゴリズム


remove削除(削除しない)
[fist,last)のvalueに等しいすべての要素を除去します.このアルゴリズムは、本当にコンテナからそれらの要素を削除するのではなく(換言すれば、コンテナのサイズは変更されていません)、valueに等しくない(つまり除去するつもりはありません)各要素をfirstの後の空間に順番に割り当てます.
戻り値ForwardIteratorは、再整理された最後の要素の次の位置を示します.
残りのデータを削除する場合は、返された反復器をコンテナのerase()member functionに渡します.
remove_copy():[first,last)区間内のvalueに等しいすべての要素を除去します.それらの要素は本当にコンテナから削除されません(換言すれば、元のコンテナには何の変化もありません).ではなく、結果をresultで開始位置を示すコンテナにコピーします.新しいコンテナは元のコンテナと重ねることができますが、新しいコンテナに実際に値を付けると、古いコンテナの大きさを超えて予想できない結果が発生します.戻り値OutputIteratorは、コピーされた最後の要素の次の位置を示します.注意:arrayはremove()とremove_を使用するのに適していません.if()はarrayがサイズを縮小できないため、残留データが永遠に存在する.arrayにとって人気のあるアルゴリズムはremove_copy()とremove_copy_if().
STLソース:
template
ForwardIterator remove(ForwardIterator first,ForwardIterator last, const T& value)
{
    first=find(first,last,value);
	ForwardIterator next=first;

	return first==last?first:remove_copy(++next,last,first,value);
}

remove_copy

template
OutputIterator remove_copy(InputIterator first,InputIterator last,OutputIterator result,const T& value)
{
    for(;first!=last;++first)
	{
	    *result=*first;
		++result;
	}
	return *result;
}

注:コンテナvectorとdequeでは、アルゴリズムremoveを使用してvalue値に等しい要素を除去し、再整理された最後の要素の次の位置に戻ることができます.
listの場合、アルゴリズムremoveを使用してvalue値に等しい要素を除去し、再整理された最後の要素の次の位置に戻るか、独自のメンバー関数removeを使用して、より効率的なメンバー関数の使用を推奨できます.
標準的な関連コンテナでは、earseを直接使用してvalueに等しい要素を除去するのが最適です.
コードの例:
//  remove
#include
#include
#include
#include
#include
#include

using namespace std;

int main()
{
	int data[]={-2,0,-3,1,1,0,-2,1,1,10};

	//  vector---            
	cout< coll(data,data+10);
	vector::iterator pos;

	//       
	copy(coll.begin(),coll.end(),ostream_iterator(cout," "));
	cout<(cout," "));
	cout<(cout," "));
	cout<(cout," "));
	cout< coll1(data,data+10);
	//deque coll1(data,data+10);
	//list coll1(data,data+10);

	//   
	copy(coll1.begin(),coll1.end(),ostream_iterator(cout," "));
	cout<(cout," "));
	cout< coll2;

	for(int i=0;i(cout," "));
	cout<(cout," "));
	cout<

remove_if:
[first,last)区間内のすべての擬似関数predによってtrueに査定された要素を除去します.removeと同様に、それらの要素は本当に容器から削除されず、pred条件に合致しない要素はfirst後の空間に順番に割り当てられます.
戻り値ForwardIteratorは、再整理された最後の要素の次の位置を示します.このアルゴリズムには、残留データがいくつか残っています.残留データを削除する場合は、返される反復器を区間のあるコンテナearse()member functionに渡します.
remove_copy_if:[first,last)区間内のすべての擬似関数predによってtrueと評価された要素を除去します.それらの要素を本当に容器から削除するわけではありません(換言すれば元の容器には何の変化もありません).ではなく、結果をresultで開始位置を示すコンテナにコピーします.新しいコンテナは元のコンテナと重ねることができますが、新しいコンテナに対して実際に値を与えると、古いコンテナの大きさを超えて予想できない結果が発生します.戻り値OutputIteratorは、コピーされた最後の要素の次の位置を示します.
STLソース:
template
ForwardIterator remove_if(ForwardIterator first,ForwardIterator last,Predicate pred)
{
     first=find_if(first,last,pred);
	 ForwardIterator next=first;

	 return first==last?first:remove_copy_if(++next,last,first,pred);
}
template
OutputIterator remove_copy_if(OutputIterator first,OutputIterator last,OutputIterator result,Predicate pred)
{
    for(;first!=last;++first)
	{
	    if(!pred(*first))
		{
	       *result=*first;
		   ++result;
		}
	}
	return result;
}