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 循环正在做的事情,尽管这需要手动执行)。

那么有没有办法直接比较数组的内容,最好用一行代码呢?如果不是,为什么不呢?我想了解这个问题背后的科学。

4

3 回答 3

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 */ }
于 2012-07-03T06:54:12.247 回答
4

您已标记问题 C++。这意味着您应该使用std::vector. 它已经重载operator==了你想要的(对于两个向量)。

您还可以将std::equalorstd::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);
}

(这引用了未降级为指针的数组,以首先检查它的声明大小,因此是安全的)

当然,所有这些方法都有一个隐藏在内部的循环,用于逐个比较元素。但你不必写它。

于 2012-07-03T06:51:34.393 回答
1

你可以使用memcmp函数。如果数组相等,则返回 0。这是一个描述:http ://www.cplusplus.com/reference/clibrary/cstring/memcmp/

于 2012-07-03T06:44:31.437 回答