順序を維持しながら、文字列要素を含むベクター コンテナーから重複要素を削除する方法はありますか。
今までsetメソッドを使ってきましたが、順番が保持されません。
この問題に関して remove_if を使用する方法がわかりません。
一時的なコンテナを使用するのはどうですか:
std::vector< int >::iterator i , j ;
std::set< int > t_set;
for( i = v.begin() , j = v.begin() ; i != v.end() ; ++i )
if( t_set.insert( *i ).second)
*j++ = *i ;
v.erase( j , v.end() );
を使用std::remove_if
すると、次のように考えることができます。
std::set<int> t_set;
std::vector<int> res; //Resultant vector
remove_copy_if(v.begin(), v.end(), std::back_inserter(res),
[&t_set](int x){
return !t_set.insert(x).second;
} );
空の配列を作成し、元のベクターを繰り返し処理して、ベクター内の各項目の最初のインスタンスのみをコピーすることができます。アイテムをセットに追加し、新しい配列に追加する前にセット内にアイテムが存在するかどうかを確認することで、アイテムがまだベクター内にあるかどうかを追跡できます。
簡単な解決策
std::vector<int>::iterator it;
it = std::unique (myvector.begin(), myvector.end());
この反復子は、最後の要素の次の要素を指します。必要でない場合は、この反復子を使用しないでください。
詳細については、これを参照してください
編集:
ベクトルがソートされると思ったので、新しい解決策は次のようになります。
vector<int> vec= {5,1,2,3,5,4,2,1,1,4,3,2,4,5,2,1,3,5,2,3,5,2,3,2,3,5,2,1,3};
set<int> s;
vector<int>::iterator vecIter=vec.begin();
vector<int>::iterator vecIterCopy;
for(;vecIter!=vec.end(); vecIter++)
{
if(s.find(*vecIter)==s.end())
{
s.insert(*vecIter);
*vecIterCopy++ = *vecIter;
}
}
あなたはこれを行うことができます:
std::vector<int> v = { 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 8 };
// 1 2 2 3 4 5 6 7 8 9 8
for(size_t i=0;i<v.size();i++)
{
for(size_t j=0;j<v.size();j++)
{
if(v[i] == v[j] && i != j)
{
v.erase(v.begin()+j);
j--; // Fix for certain datasets ie:
} // 1 2 1 1
}
}
// Produces:
// 1 2 3 4 5 6 7 8 9