C++標準ライブラリ---シリアルコンテナの除去アルゴリズム
3857 ワード
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ソース:
注:コンテナvectorとdequeでは、アルゴリズムremoveを使用してvalue値に等しい要素を除去し、再整理された最後の要素の次の位置に戻ることができます.
listの場合、アルゴリズムremoveを使用してvalue値に等しい要素を除去し、再整理された最後の要素の次の位置に戻るか、独自のメンバー関数removeを使用して、より効率的なメンバー関数の使用を推奨できます.
標準的な関連コンテナでは、earseを直接使用してvalueに等しい要素を除去するのが最適です.
コードの例:
remove_if:
[first,last)区間内のすべての擬似関数predによってtrueに査定された要素を除去します.removeと同様に、それらの要素は本当に容器から削除されず、pred条件に合致しない要素はfirst後の空間に順番に割り当てられます.
戻り値ForwardIteratorは、再整理された最後の要素の次の位置を示します.このアルゴリズムには、残留データがいくつか残っています.残留データを削除する場合は、返される反復器を区間のあるコンテナearse()member functionに渡します.
remove_copy_if:[first,last)区間内のすべての擬似関数predによってtrueと評価された要素を除去します.それらの要素を本当に容器から削除するわけではありません(換言すれば元の容器には何の変化もありません).ではなく、結果をresultで開始位置を示すコンテナにコピーします.新しいコンテナは元のコンテナと重ねることができますが、新しいコンテナに対して実際に値を与えると、古いコンテナの大きさを超えて予想できない結果が発生します.戻り値OutputIteratorは、コピーされた最後の要素の次の位置を示します.
STLソース:
[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;
}