将对象数组与对象字段数组进行比较

时间:2011-03-16 23:17:08

标签: c++

有没有一种比较arr [i] .A到A [i]和arr [i] .B到B的好方法?

int A[10], B[10];

class Foo {
   int A, B;
};

Foo arr[10];

我可以做以下事情:

for (i=0;i<10;i++) {
   if (A[i] == arr[i].A) {}
   if (B[i] == arr[i].B) {}
}

但是,这很痛苦,特别是如果有很多字段,而if()条件反复做同样的事情,会有很多代码重复。我真正想做的是以某种方式参数化并调用函数(test(A,arr))。我想我可以通过使用#define宏来解决这个问题,但这看起来很难看。

有什么建议吗?

另外,我想避免创建一个新的Foo对象数组,因为我不想创建可能包含许多我不关心的字段的新对象,我也想比较不同的字段子集。

2 个答案:

答案 0 :(得分:1)

有一些标准库算法可以对容器(包括数组,有点)进行操作,但是使用它们通常会产生比直接循环更难以读取和维护的代码,并且没有更短或更高效的代码。

然而,听起来好像你可能想知道指向成员的指针。

bool all_equal(int Foo::* member, const Foo * obj_array, const int * elem_array, size_t n) {
  for (int i=0; i<n; ++i) {
    if (obj_array[i].*member != elem_array[i]) return false;
  }
  return true;
}

...

if (all_equal(&Foo::A, arr, A, 10) && all_equal(&Foo::*B, arr, B, 10)) ...

虽然实际上你应该概括一下:

template<typename T, typename E>
bool all_equal(E T::* member, const T* obj_array, const E* elem_array, size_t n) {
  for (int i=0; i<n; ++i) {
    if (obj_array[i].*member != elem_array[i]) return false;
  }
  return true;
}

(危险:以上所有代码都是未经测试的,可能完全由错误组成。)

答案 1 :(得分:1)

如果范围大小相等,则可以将std :: equal与谓词(或lambda)一起使用:

bool CompA( int lhs, Foo rhs ){
   return lhs == rhs.A;
};
...
// to check for equality
bool result = std::equal( A, A + 10, arr, CompA );
...
// to see where the mismatch is
std::pair< int*, Foo* > result = std::mismatch( A, A + 10, arr, CompA );
size_t index = result.first - A;
if( index < 10 ){
   std::cout << "Mismatch at index " << index << " A = " << *result.first << " Foo.A = " << (*result.second).A << std::endl;
}
相关问题