2011-03-16 258 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