这只是一个小问题,更多的是为了理解数组的使用而不是解决一个难题。
我目前有一个由四个整数(邻居)组成的数组,我想将其与一组其他数组(在其他任何地方都不存在 - 我不需要存储它们)进行比较。我想知道四个数组 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 循环正在做的事情,尽管这需要手动执行)。
那么有没有办法直接比较数组的内容,最好用一行代码呢?如果不是,为什么不呢?我想了解这个问题背后的科学。