2012-07-03 141 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