检查数组是否相等的最快方法是?

时间:2018-06-18 15:56:53

标签: c++ arrays function

我正在编写一个游戏模拟,测试棋盘上是否有任何棋子。如果一块不是我希望AI在板上放置一块,为此我创建了一个bool函数来测试所有块是否都设置为0,这意味着它们还没有进入板。当前的功能启动,但我觉得有一个更简单的方法:

bool checkPiece(int a[])
{
int n = 0;
bool e = true;
while (e == true && n < 4)
{
    if (a[n] == 0 )
    {
        n++;
    }
    else
    {
        return false;
    }
}
return true;
}

4 个答案:

答案 0 :(得分:3)

我使用标准库,这是一般订单:

bool checkPiece(int const *a) { 
    return std::all_of(a, a+4, [](int i) { return i == 0; });
}

如果你真的想自己做这个工作,也许就是这个订单上的东西:

bool checkPiece(int const *a) { 
    for (int i=0; i<4; i++)
        if (a[i] != 0)
            return false;
    return true;
}

大多数情况下,您还要传递类似集合的内容,例如std::arraystd::vector(通过const引用),或类似范围的内容,例如{ {1}}而不是指针。这将(通过一个明显的例子)使获得通过的大小变得微不足道,而不是盲目地假设是4项。

答案 1 :(得分:2)

这基本上就是你所需要的:

for (size_t n = 0; n < 4; ++n) {
    if (a[n]) return false;
}
return true;

你不需要e,当从开始到结束迭代数组(或之前返回)时,for循环比一段时间更容易读写。您可以使用算法,但我怀疑它会使您的代码更具可读性,您应该避免像瘟疫这样的幻数(如果您将数组的大小更改为4以外的其他内容会怎么样?)。

答案 2 :(得分:1)

您可以使用std::count以少量代码解决此问题。

bool checkPiece(int const *a) { 
    return std::count(a, a+4, 0) == 4;
}

答案 3 :(得分:0)

首先,不要使用幻数而不是传递数组大小。如果您更改了电路板的大小,则必须在程序中找到每个4并确定它实际上是数字4还是数组的大小。将大小传递给您的函数。

其次,给函数一个描述它的功能的名称。 checkPiece没有告诉我任何事情。

当您进行这些更改时,请使用标准算法:

bool noPieces(int const *a, int size) {
    return std::all_of(a, a + size, [](int pc) { return pc == 0; }
}