4

順序を維持しながら、文字列要素を含むベクター コンテナーから重複要素を削除する方法はありますか。

今までsetメソッドを使ってきましたが、順番が保持されません。

この問題に関して remove_if を使用する方法がわかりません。

4

5 に答える 5

6

一時的なコンテナを使用するのはどうですか:

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; 
    } );
于 2013-08-03T15:04:42.697 に答える
2

空の配列を作成し、元のベクターを繰り返し処理して、ベクター内の各項目の最初のインスタンスのみをコピーすることができます。アイテムをセットに追加し、新しい配列に追加する前にセット内にアイテムが存在するかどうかを確認することで、アイテムがまだベクター内にあるかどうかを追跡できます。

于 2013-08-03T14:22:54.787 に答える
1

簡単な解決策

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;
        }
    }
于 2013-08-03T15:03:43.890 に答える
1

あなたはこれを行うことができます:

 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
于 2013-08-03T14:21:21.370 に答える