2016-06-18 9 views
0

私はBulls &牛というゲームのコードを書いています。私はすでに1つのベクトルの値が(同じインデックスにある場合)同一であるかどうかを調べています。しかし、私はどのように2つのベクトルを移動し、1つの値が他のベクトルの他のインデックスの値にも一致するかどうかを調べるforループを書く方法がわかりません。助けていただければ幸いです。ありがとうございました!あるベクトルの値と別のベクトルの値が一致するかどうかを確認したい

+0

*ソースコード*の入力をお願いします。 –

+0

'' std :: find() '](http://en.cppreference.com/w/cpp/algorithm/find)を使って' std :: vector'(または他のほとんどのコンテナ)の値を見つけることができます)。 –

答えて

0

は、単純なループない:両方のベクターは、長さNであり、これはN 比較を行う場合

vector<int> v1, v2; 
//Initialize v1 and v2... 

for (auto& i: v1) //Loop through each element of v1 
    for (auto& j: v2) //Same for v2 
     if (i == j) 
      std::cout << "Ok! They match!" << std::endl; 
+0

これはC++ 11の場合にのみ言及する必要があります。それ以外の場合は、autoを実際のタイプにする必要があります。 – Bettorun

3

強引アプローチは

for(auto& x1 : vec1) 
    for(auto& x2 : vec2) 
     if(x1 == x2) 
      return true; 
return false; 

あります発見されなかった場合、および平均して。

、かなりungoodあるO(N )、二次の時間です。あなただけセットで1つのベクトルのすべての値を置くことができ、より良いパフォーマンスを得るために


。次に、他のベクトルの各値をセットに対してチェックすることができます。 std::setのために、各値のチェックは、ログ(N)、およびそのnは値をチェックしているあなたにO(nはログN)時間を与えます。 std::unordered_setの場合、検査は本質的に一定時間であり、全体をO(n)に減らします。

しかし、少なくとも私が使っているg ++のバージョン(MinGW 5.1)では標準ライブラリの実装ではenumの値をハッシュするサポートがないので、ハッシュ関数を指定する必要がありますコードを移植性のあるものにするための一般的なハッシュサポートが含まれます。

ので、

using Item = decltype(v1)::value_type; 
std::set<Item> v1_values{ v1.begin(), v1.end() }; 
for(auto& x2 : v2) 
    if(v1_values.count(x2) > 0) 
     return true; 
return false; 

免責事項:コードでも、コンパイラによってちらっと見ていない、と私はcountが、私は一般的にちょうど標準ライブラリのものを包むので、チェックするための最もエレガントな方法であるかどうかが不明です。

最高のものの性能面は、例えば、 インクリメンタルアプローチを使用することです

v1またはv2に値を追加するたびにそのようなセットを更新します。これはコードの複雑さを増し、これらのベクターを使用するものとは独立していません。私。より侵害的な解決策です。一般的に、複雑さを増すことでパフォーマンスを犠牲にします。

関連する問題