2017-10-27 15 views
-1

私は2セットあります。私は最初のセットから1つの要素を選び、それを2番目のセットのすべての要素と比較したいと思います。私はセットのすべての要素のためにそれを繰り返す必要があります!私はこのコードを試しました:ループ内の2つのセットをif条件として比較する方法

int main() { 
set<int> Y; 
set<int> X; 
for (auto iter = Y.begin(); iter != Y.end(); iter++) { 

    for (auto iter1 = X.begin(); iter1 != X.end(); iter1++) { 

     if (*iter != *iter1) { 
      B[*iter1 - 1] = 1; 
     } 
    } 
    return 0; 
} 

しかし私には正しい答えはありません!私は正しい方法で状態なら書き込みませんでした!

+3

'B'とは何ですか? [MCVE]を入力してください。あなたはどんな結果を期待していますか?それはあなたが実際に得るものとはどのように違いますか?あなたの質問に意味のある答えが出るほどの情報がありません。 –

+1

[std :: any_of](http://en.cppreference.com/w/cpp/algorithm/all_any_none_of)を探していますか? –

+0

['std :: set :: find()'](http://www.cplusplus.com/reference/set/set/find/) – Barmar

答えて

1

使用std::set::find()値がセットのメンバーである場合教えします

for (auto iter = Y.begin(); iter != Y.end(); iter++) { 
    if (X.find(*iter) != X.end()) 
     B[*iter1 - 1] = 1; 
    } 
} 
1

if-conditionが実装されているのは、2番目のセットの要素のいずれかで条件が満たされていないかどうかを確認していることになります。しかし、あなたのdiscriptionによると、あなたが行動を起こす前に、第2セットのすべての要素に比較ですがチェックしたい:

for (auto iter=set1.begin(); ...) { 
    bool equal_toany = False; 
    for (auto iter1=set2.begin(); ...) { 
    if (*iter == *iter1) { 
     equal_toany = True; 
     break; 
    } 
    } 
    if (!equal_toany) { 
    dostuff() // B[*iter -1] =1 
    } 
} 
+0

お世話になりませんか?最初のリストの最初の要素が、B [* iter] = 1、Bが配列 –

+0

を書くことができる2番目の要素の非要素と等しくないかどうか教えてください。skypjackとstd-libの答えこのタスクのための便利な関数 '' std :: set_difference'も提供しています。それでもネストされたfor-loopsで解決する方法を知ることは有益かもしれません –

2

私が持っているし、2セット。私は最初のセットから1つの要素を選び、それを2番目のセットのすべての要素と比較したいと思います。

std::set_difference(限り、あなたのコンテナがソートされ、std::setはもちろんのソートコンテナ、のように)あなたが探していると呼ばれています。

あなたのループを取り除き、上記の関数を呼び出して、最初のセットにあり、2番目のセットにない要素を見つけて、それを繰り返してください。
現実世界のほとんどのケースで複雑さはあなたのアプローチのものより低くなければなりません(2(N+M-1)の比較と固定数の比較N*Mの比較があります。Nは最初のセットのサイズです)、Mは2番目のセット)。
欠点は、反復する要素を脇に格納するためにメモリを割り当てる必要があることです。あなたが支払うことができる価格が実際の問題にほとんど依存しているとすれば、それは言うのが難しいです。

関連する問題