C++;如何检查N个对象中的某些对象是否相等 我有一些C++对象,我想检查它们是否相等。< /P> 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; }

C++;如何检查N个对象中的某些对象是否相等 我有一些C++对象,我想检查它们是否相等。< /P> 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; },c++,C++,我的对象由一些整数(从u到u,选择u)组成,该类提供了比较两个对象的IsEqual方法 如果两个对象具有相同的值,则调用obj1.IsEqual(obj2)将返回true 但是,如何比较N个对象?是否可以将对象推回到std::vector并使用std::unique 将对象放在一个集合中。完成后,集合将只包含唯一的对象 您可以在std::set和std::unordered_set之间进行选择,具体取决于您拥有的对象数量和比较函数的成本 std::set需要一个比较函数(operator b.f

我的对象由一些整数(从u到u,选择u)组成,该类提供了比较两个对象的IsEqual方法

如果两个对象具有相同的值,则调用
obj1.IsEqual(obj2)
将返回true


但是,如何比较N个对象?是否可以将
对象推回到
std::vector
并使用
std::unique

将对象放在一个集合中。完成后,集合将只包含唯一的对象


您可以在
std::set
std::unordered_set
之间进行选择,具体取决于您拥有的对象数量和比较函数的成本

std::set
需要一个比较函数(
operator b.from)
返回false;
if(to_uub到)
返回false;
如果(选择uu
将对象放在一组中。完成后,集合将只包含唯一的对象


您可以在
std::set
std::unordered_set
之间进行选择,具体取决于您拥有的对象数量和比较函数的成本

std::set
需要一个比较函数(
operator b.from)
返回false;
if(to_uub到)
返回false;
如果(选择uu
如果您创建一个对象数组,然后运行一个简单的循环来比较它们,就像这样

> board[n];

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

对于(inti=0;i,如果您创建一个对象数组,然后运行一个简单的循环来比较它们,如下所示

> board[n];

for(int i=0; i<n ; i++)
  for(int j=i; j<n ; j++)
      board[i].Isequal(board[j]);
>板[n];
对于(int i=0;i
是否可以将对象推回std::vector并使用std::unique

是的,这是可能的,但这将要求您首先对向量进行排序,然后使用与排序相同的标准使用
std::unique
。注意
std::sort
std::unqiue
要求严格的弱排序,如概念中所述。您的
IsEqual
函数不满足该要求

是否可以将对象推回std::vector并使用std::unique


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

Y您可以尝试以下自制代码:

  • 将对象放入数组
  • 将每个对象与循环中数组中的其他对象进行比较
  • 循环将如下所示:

    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);
    
    A[]arr={A,b,c,d};
    int计数器=0;
    对于(int i=0;i
    您可以尝试以下自制代码:

  • 将对象放入数组
  • 将每个对象与循环中数组中的其他对象进行比较
  • 循环将如下所示:

    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);
    
    A[]arr={A,b,c,d};
    int计数器=0;
    对于(int i=0;i
    Try
    A.IsEqual(B)
    在一个循环中,你只是想检查其中一些是否相等,还是想知道哪些相等?我不在乎哪些相等。只是想确保现在没有重复的Try
    A.IsEqual(B)
    在循环中,你只是想检查一些是否相等,还是想知道哪些相等?我不在乎哪些相等。只是想确保现在没有重复的
    std::unordered_set
    也要求相等,
    std::hash
    只需要一个对象
    std::unordered_set
    要求相等同样,和
    std::hash
    只需要一个对象需要在IsEqual中完成什么才能满足这个概念?@cateof通常以小于比较的方式实现,而不等于您的比较。@cateof这应该是一个好的开始:需要在IsEqual中完成什么才能满足这个概念?@cateof通常以小于t的方式实现汉比,不等于你有。@第二个循环应该是一个好的开始:第二个循环缺少了1个,不应该是长度为1而不是ARR.Load。让我们考虑第一个元素<代码> A<代码>,将它与2, 3个……等等进行比较,最后一个<代码> d>代码>。所以最后一个元素也需要包含在内。第二个循环是缺少-- 1?不应该是长度1而不是ARR.Load。让我们考虑第一个元素<代码> A<代码>,将它与2, 3个……等等进行比较,最后一个<代码> d>代码>。因此,最后一个元素也需要包括在内。