有没有一种比较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对象数组,因为我不想创建可能包含许多我不关心的字段的新对象,我也想比较不同的字段子集。
答案 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;
}