这只是一个小问题,更多的目的是了解数组的使用,而不是解决一个棘手的问题。
我目前有一个包含四个整数(邻居)的数组,我想与一组其他数组进行比较(其他地方不存在 - 我不需要存储它们)。我想知道四个阵列邻居中哪一个是相同的。作为一个不知道更好的人,我的第一次尝试就是这样做:
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 :(得分:4)
您已标记了问题C ++。这意味着您应该使用std::vector
。它已经超载operator==
,可以满足您的需求(对于两个向量)。
您还可以使用std::equal
或std::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);
}
(这会引用不降级为指针的数组,先检查它的声明大小,因此是安全的)
当然,所有这些方法都有一个隐藏在里面的循环,逐个比较元素。但你不必写它。
答案 1 :(得分:4)
C ++最好的方法是使用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 */ }
答案 2 :(得分:1)
您可以使用memcmp
功能。如果数组相等则返回0.以下是描述:http://www.cplusplus.com/reference/clibrary/cstring/memcmp/