2009-03-13 12 views

答えて

6

stl algorithmsは、特に何が必要である、set symmetric differenceを計算し、セット操作を実行するためにいくつかの機能を提供します。

は、ここで使用例は次のとおり

#include <algorithm> 
#include <vector> 

int main(int argc, char **argv) { 

    std::vector<int> v1; 
    v1.push_back(1); 
    v1.push_back(2); 
    v1.push_back(3); 
    v1.push_back(4); 
    v1.push_back(5); 
    v1.push_back(6); 

    std::vector<int> v2; 
    v2.push_back(2); 
    v2.push_back(4); 
    v2.push_back(6); 
    v2.push_back(8); 

    // Ranges must be sorted! 
    std::sort(v1.begin(), v1.end()); 
    std::sort(v2.begin(), v2.end()); 

    std::vector<int> res; // Will contain the symmetric difference 
    std::set_symmetric_difference(v1.begin(), v1.end(), 
            v2.begin(), v2.end(), 
            std::back_inserter(res)); 

    // Copy result to the output 
    std::copy(res.begin(), res.end(), std::ostream_iterator<int>(cout, " ")); 
    // Prints "1 3 5" 

    return 0; 
} 

std::set_symmetric_differenceは、2つの範囲をとる(すなわち、2 OutputIteratorsの対)と、それが結果を置くInputIterator。また、結果範囲の最後にイテレータを返します。


EDIT

私はちょうどあなたの質問にご意見をお読みください。あなたは元の2つのベクトルを修正したい場合は、std::set_differenceを使用することができます。ここでは

vector<int>::iterator endRange; 
endRange = set_difference(v1.begin(), v1.end(), 
          v2.begin(), v2.end(), 
          v1.begin()); 
v1.erase(endRange, v1.end()); 

は、我々は差集合V1の結果を置く - v2はv1のに。しかし、v1が変更されて以来、私たちはその逆を行うことはできません。ソリューションは、v1とv2の交点を計算し、この交差点との違いです:

vector<int> inter; 
set_intersection(v1.begin(), v1.end(), 
       v2.begin(), v2.end(), 
       back_inserter(inter)); 
// inter is "2 4 6" 

v1.erase(set_difference(v1.begin(), v1.end(), 
         inter.begin(), inter.end(), 
         v1.begin()) 
     v1.end()); 
// v1 is "1 3 5" 

v2.erase(set_difference(v2.begin(), v2.end(), 
         inter.begin(), inter.end(), 
         v2.begin()) 
     v2.end()); 
// v2 is "8" 

私がはるかにパフォーマンスのソリューションがありますが、この1つは明確で、かつ実際に広く使用することによって、あなたの意図を伝えると思います既知のstlアルゴリズム。

+0

ベクトル値10で1つのエントリを持っていると言います...私は2つのベクトルを取得する必要があります1つは1,3,5の他に10です – yesraaj

+0

アルゴリズムベクトルで使用しているクラスに制約を課す – yesraaj

+0

これらのアルゴリズムでは、演算子<を使用します。クラスで提供されていない場合は、比較関数オブジェクト(ファンクタまたは関数ポインタ)をパラメータとして取るアルゴリズムのバージョンを使用できます。 –

0

ソート2つのベクトルオブジェクト、そして一般的なマージ操作を行う並列に歩く==私が定義されているどのようにそれらの両方 から共通のエンティティを削除するvector<class1a>,vector<class1b>を持っていると言います。それはどの項目が同一であるかを教えてくれます。

0

単純な方法は、最初のベクトルの各要素を2番目の配列の各要素と比較し、3番目のベクトルに任意の一致を追加することです。 n^2反復を終えると、3番目のベクトルを歩き、最初の2つからそれらのオブジェクトを削除します。

最適な解決策ではありませんが、ベクトルの大きさに応じて最も簡単な方法です。

0

class1aclass1bのアイテムの各ペアについて、それらが等しくない場合は出力セットに追加します。それ以外の場合は、そのようなインスタンスを1つだけ追加します。配列の長さの最小値を繰り返します。 1つが長い場合は、もう少し残っています - これらをすべてセットに追加しようとします。

0

Setにvectorの値を追加し始めます。 class1とclass2のequalsメソッドをオーバーライドして、オブジェクトをどのように等しくするかを決めます。 equalsをデフォルトでオーバーライドしないと、==が比較に使用され、オブジェクトは異なるクラス==であるため、常にfalseが返されます。したがって、equalsメソッドをオーバーライドする必要があります。

1

stlヘッダーアルゴリズムでは、 "set_symmetric_difference"という関数があります。この関数は、1つの要素のすべてを入れますが、両方のソース範囲を1つの宛先範囲に入れません。

両方の範囲がソートされなければならないことに注意してください。

msdn documentation

関連する問題