2011-09-01 134 views
3

有沒有辦法讓等號運算符能夠用於比較同一類型的數組?C++中的數組內容相等

例如:

int x[4] = {1,2,3,4}; 
int y[4] = {1,2,3,4}; 
int z[4] = {1,2,3,5}; 
if (x == y) cout << "It worked!" 

我知道,因爲是,它只是比較指針值 - 但我希望有某種類型定義伎倆或類似的東西,因此它不會需要一個循環或者一個memcmp調用。

+5

我建議使用一個'VECTOR'代替用於陣列這個。 – MAK

+0

我幾乎總是使用矢量,所以我同意,但在這種情況下,元素的數量將不斷變化5,並且永遠不會改變,所以我認爲一個簡單的數組會更好。 –

+0

你爲什麼認爲它會更好?你可以完美地處理常量大小的向量。 – KillianDS

回答

18

您可以使用標準equal算法

if (std::equal(x,x+4,y)) cout << "It worked!"; 
10

使用std::equal爲:

if(std::equal(x, x+ xsize, y)) std::cout << "equal"; 

它檢查以相同的順序元素的平等。這意味着,根據std::equal,以下數組不相等。

int x[4] = {1,2,3,4}; 
int y[4] = {1,2,4,3}; //order changed! 
+0

'set_difference'部分是錯誤的...該算法需要作爲兩個範圍排序的先決條件,這意味着它不能應用於上面的例子 - 並會提供錯誤的輸出,可能是'[3,3]'的行中的一些東西。然後再次,如果你打算在調用算法之前排列數組,並且你只關心相等性,那麼'std :: equal'就足夠了,並且會比'std :: set_difference'便宜。 –

+0

@David:是的。我看到了文檔,並意識到這一點。刪除了不正確的部分。 – Nawaz

8

另一種方法是來包裝你的數組中std::array模板,這將使小包裝類的數組。除非您獲得operator=的默認定義,否則一切與正常情況相似,因此您可以像平常那樣使用==來執行預期的操作。

0

我認爲在這裏還要注意C++不允許你在沒有至少1個用戶定義類型的情況下重載operator==。那將是「好的」解決方案,但即使可以,也可能是一個糟糕的主意。 C++中的陣列......都是邪惡的林地生物。

std::equal可能是你最好的選擇。儘管你可以用一個* gasp *宏做你想做的,但我認爲這很棘手。

1

由於陣列是相同的類型和長度的,可以使用memcmp測試相等,也就是值和位置平等:

int array1[4] = {1, 2, 3, 4}; 
int array2[4] = {5, 6, 7, 8}; 

if (memcmp(array1, array2, sizeof(array1)) == 0) 
{ 
    cout << "arrays are equal" << "\n"; 
} 
else 
{ 
    cout << "arrays are not equal" << "\n"; 
} 
+0

這是一個恥辱,這個答案沒有得到更多upvotes;人們似乎對C過敏,儘管它有時可以使代碼更好(即「+ 4」和「sizeof」)。 – congusbongus