C ++如何检查N个对象中是否有一些是相等的

时间:2017-06-07 20:08:08

标签: c++

我有一些C ++对象,我想检查一些是否相同。

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_)组成,该类提供了IsEqual方法来比较两个对象。

如果两个对象具有相同的值,则

调用obj1.IsEqual(obj2)将返回true。

但是如何比较N个对象?可以将push_back个对象转换为std::vector<Board>并使用std::unique吗?

4 个答案:

答案 0 :(得分:3)

将对象放入一组中。完成后,该集将仅包含唯一对象。

您可以在std::setstd::unordered_set之间进行选择,具体取决于您拥有的对象数量和比较功能的费用。

std::set需要比较功能(operator<)。 O(N * logN)复杂度。

std::unordered_set需要散列和相等函数(std::equal_to对您的对象进行2次const引用,std::hash接受对象的const引用。 O(N)复杂性。

NB。双嵌套循环将是O(N 2 )复杂度。

NB2。 std::unique要求对矢量进行排序,因为它只比较相邻的元素。

比较函数示例:

    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 :(得分:1)

如果你创建了一个对象数组,然后运行一个简单的循环来比较它们

> board[n];

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

您可以随时使用更有效的算法进行比较。

答案 2 :(得分:1)

您可以尝试如下家庭烹饪代码:

  1. 将对象放入阵列中
  2. 将每个对象与循环中数组中的其余对象进行比较
  3. 循环看起来像:

    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);
    

答案 3 :(得分:0)

  

是否可以将push_back对象转换为std :: vector并使用std :: unique?

是的,这是可能的,但这需要您先对矢量进行排序,然后使用与排序时相同的标准使用std::unique。注意std::sortstd::unqiue需要严格的弱排序,如Compare概念中所述。您的IsEqual函数不符合该要求。