2011-03-16 217 views
0

领域的数组对象数组有没有[我]。一个比较常用3到A [i]和改编[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()条件做了同样的事情,并且,那里会是很多代码重复。我真正想要做的是某种程度上参数化这一点,像调用一个函数(试验(A,ARR))。我想我可以通过使用#define宏来解决这个问题,但这看起来很难看。

有什么建议吗?

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

+3

'A [i]'是单个int,而'arr [i] .A'是一个ar 10单位射线。你想比较每个'A [i]'到'arr [i] .A'中的每个元素吗? – TheUndeadFish 2011-03-16 23:29:17

+1

'A [1]'是不一样的类型为'ARR [I] .A'。前者是'int',后者是'int [10]'。你能澄清这个问题吗? – 2011-03-16 23:32:15

+0

糟糕。这是正确的。我根据我的意思编辑了这个问题。 – 2011-03-16 23:33:59

回答

2

如果范围大小相等的你可以使用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; 
} 
+0

很酷。这适用于我,除了一件事。我也想知道哪个索引不匹配。 – 2011-03-16 23:42:58

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

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

+0

Oooh。尼斯。不知道你能做到这一点。 – 2011-03-16 23:41:46

+0

修正了几个错别字(以上编辑),以及代码的伟大工程。谢谢! – 2011-03-17 00:37:52