2012-07-03 180 views
1

這只是一個小問題,更多的目的在於理解數組的用法,而不是解決難題。將數組與比較運算符進行比較

我目前有一個四個整數(鄰居)的數組,我想比較一組其他數組(其他地方不存在 - 我不需要存儲它們)。我想知道Neighbors四個數組中的哪一個相同。正如有人誰不知道任何好轉,我第一次嘗試這樣做:

if (Neighbors == {1, 1, 0, 0}) 
{ 
    //code... 
} 
else if (Neighbors == {0, 1, 1, 0}) 
{ 
    //code... 
} 
else if (Neighbors == {0, 0, 1, 1}) 
{ 
    //code... 
} 
else if (Neighbors == {1, 0, 0, 1}) 
{ 
    //code... 
} 

正如你所看到的,整數的順序是非常重要的。但是,上述返回的編譯器錯誤預期在大括號標記之前的主表達式。

所以不是,我嘗試這樣做:

int Sets[4][4] = { {1, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1} }; 
if (Neighbors == Sets[0]) 
{ 
    //code... 
} 
else if (Neighbors == Sets[1]) 
{ 
    //code... 
} 
else if (Neighbors == Sets[2]) 
{ 
    //code... 
} 
else if (Neighbors == Sets[3]) 
{ 
    //code... 
} 

這裏發生的是,即使Neighbors = {0, 1, 1, 0}(例如),Neighbors == Sets[1]返回false。

現在,在做了這些以及想知道爲什麼之後,我記得數組變量基本上是指向序列中第一個元素的指針。對?所以我想我得到爲什麼上面的代碼不起作用 - 我比較兩個內存地址,而不是兩個數組。所以不是我寫了這個代碼,它工作正常:

for (int ii = 0; ii < 4; ++ii) 
    { 
     bool Same = true; 
     for (int jj = 0; jj < 4; ++jj) 
     { 
      if (Neighbors[jj] != Set[ii][jj]) 
      { 
       Same = false; 
      } 
     } 

     if (Same == true) 
     { 
      //code... 
     } 
    } 

我想知道的是是否有一個比較像這樣的陣列,而不通過兩個去for循環的方式。這看起來應該比這更簡單。我知道當你只有4個值時,for循環並不是特別密集的,但我仍然認爲確定兩個數組是否包含相同的信息會更容易。如果每個數組都是連續的內存塊,我會認爲你可以看看這兩個塊並檢查它們是否相同(這基本上是for循環的工作內容,儘管這需要手動完成)。

那麼有沒有辦法直接比較數組的內容,最好是用一行代碼?如果不是,爲什麼不呢?我想了解這個問題背後的科學。

+0

剛這裏有一個提示 - 你可以在你的行後面添加一個'break;'語句'Same = false;'這會加速一點,因爲一旦你知道它是錯誤的,爲什麼繼續檢查(unles你真的想要)? – mathematician1975

+0

這是真的 - 我通常這樣做,但我這一次忘了,因爲它是如此小的一組數據。謝謝你的提醒! – GarrickW

回答

4

您已經標記了問題C++。這意味着你應該使用std::vector。它已經超載operator==,你想做什麼(對於兩個向量)。

您還可以使用std::equalstd::lexicographical_compare作爲您有迭代器的任何東西,其中包括原始數組。

當然你也可以重載operator==其他的東西。不幸的是,對於原始數組,不能重載它,因爲只有至少有一個參數是類(或結構)類型時才允許重載操作符。但是你可以覆蓋它來比較向量與數組。喜歡的東西:

template<typename T, typename Alloc, size_t S> 
bool operator==(std::vector<T, Alloc> v, const T (&a)[S]) 
{ 
    return v.size() == S && std::equal(v.begin(), v.end(), a); 
} 

(這需要引用數組不降級爲指針,以檢查它的聲明的大小第一,因此是安全的)

當然,所有這些方法都隱藏在裏面的是一個循環比較的元素一個一個。但是你不必寫它。

+0

謝謝!我也會研究那個。 – GarrickW

1

您可以使用memcmp函數。如果數組相等,則返回0.下面是一個描述:http://www.cplusplus.com/reference/clibrary/cstring/memcmp/

+0

哦,我不知道。謝謝! – GarrickW

+0

不客氣:) –

+1

這個問題被標記爲C++。在這種語言中,memcmp非常不合適。應該使用類型安全的'std :: lexicographical_compare'。 –

4

的C++ IEST辦法做到這一點是std::equal

#include <algorithm> 

用C++ 11:

if (std::equal(begin(Neighbors), end(Neighbors), begin(Sets[0])) 
{ /* then they're equal */ } 

用C++ 03:

if (std::equal(Neighbors, Neighbors + 4, Sets[0])) 
{ /* then they're equal */ } 
+0

另一個有趣的功能 - 感謝提示! – GarrickW