2017-06-07 19 views
1

私はいくつかのC++オブジェクトを持っていますが、それらのオブジェクトが等しいかどうかチェックしたいと思います。C++ N個のオブジェクトが等しいかどうかをチェックする方法

bool IsEqual(const Board& b) 
{ 
    if(b.From() != from_) 
     return false; 

    if (b.To() != to_) 
     return false; 

    if(b.Selection() != selection_) 
     return false; 

    return true; 
} 

私のオブジェクトは、いくつかの整数(のFrom_、TO_、selection_)で構成され、クラスには、2つのオブジェクトを比較するためにISEQUALの方法を提供しています。

obj1.IsEqual(obj2)は、両方のオブジェクトが同じ値を持つ場合はtrueを返します。

しかし、N個のオブジェクトを比較するにはどうすればよいですか? push_backstd::vector<Board>に、std::uniqueにはオブジェクトが可能ですか?

+0

ループでA.IsEqual(B)を試してみましょう – MaxZoom

+0

あなたはちょうどchしたいですか?一部の人が等しいかどうかを確認してください。 – molbdnilo

+0

どちらが同じかは気にしません。 – cateof

答えて

0

オブジェクトをstd :: vectorにpush_backすることは可能ですか?std :: uniqueを使用しますか?

はい、可能ですが、最初にベクターをソートしてから、std::uniqueをソートに使用したのと同じ基準で使用する必要があります。 std::sortおよびstd::unqiueは、Compareの概念に記載されているように厳密な弱い順序が必要です。あなたのIsEqual関数はその要件を満たしていません。

+0

概念を満足させるためにIsEqualで何をする必要がありますか? – cateof

+0

@cateof通常、それはあなたが持っているものと同じではなく、比較よりも少なく実装されています。 – Slava

+1

@cateofこれは良いスタートになるはずです:http://fusharblog.com/3-ways-to-define-comparison-functions-in-cpp/ – Slava

3

オブジェクトをセットに入れます。設定が完了すると、セットには一意のオブジェクトのみが含まれます。

オブジェクトの数と比較機能のコストによって、std::setstd::unordered_setの間で選択できます。

std::setは、比較機能(operator<)が必要です。 O(N * logN)の複雑さを含む。

std::unordered_setには、ハッシュ関数と等価関数(std::equal_to)が必要です。オブジェクトへのconst参照は2つで、オブジェクトへのconst参照はstd::hashです。 O(N)の複雑さ。

NB。二重ネストされたループはO(N )の複雑さになります。

NB2。 std::uniqueは、隣接する要素のみを比較するため、ベクトルをソートする必要があります。あなたがオブジェクトの配列を作成し、その後、あなたが常に比較し、より効率的なアルゴを使用することができ、この

> board[n]; 

for(int i=0; i<n ; i++) 
    for(int j=i; j<n ; j++) 
     board[i].Isequal(board[j]); 

のようにそれらを比較するために、単純なループを実行する場合

bool operator< (const Board& b) const { 
     if (from_ < b.from_) 
      return true; 
     if (from_ > b.from_) 
      return false; 
     if (to_ < b.to_) 
      return true; 
     if (to_ > b.to_) 
      return false; 
     if (selection_ < b.selection_) 
      return true; 
     return false; 
    } 
+1

'std :: unordered_set'には同等性が必要で、' std :: hash'には1つのオブジェクトしか必要ない – Slava

1

例は、機能を比較します。

1

あなたは以下のように家庭料理のコードを試すことができます。

  • がループループで配列のオブジェクトの残りの部分に
  • を各オブジェクトを比較し、アレイ内の

    1. プット・オブジェクトを

      A[] arr = {a, b, c, d}; 
      int counter = 0; 
      for (int i=0; i < arr.length -1 ; i++) { 
          for (int j=i+1; j < arr.length; j++) { 
          if (arr[i].IsEqual(arr[j])) counter++; 
          } 
      } 
      printf("There is %d objects that are equal", counter); 
      
    +0

    2番目のループには-1がありませんか? arr.lengthの代わりにarr.length -1であってはなりませんか? – cateof

    +0

    最初の要素 'a'を2番目、3番目、···と最後の1つの' d'と比較します。したがって、最後の要素も同様に含める必要があります。 – MaxZoom

    関連する問題