我检查两个数组是否相等的方法有什么问题吗?

问题描述 投票:0回答:5

我正在尝试编写一个程序,使用 for 循环检查数组中的所有值是否相等,但除了不断重复之外,我无法找到 if 语句检查数组中的每个值是否相等的方法

"if a[i] == a[1] && a[i] == a[0]" 
等等。我不想这样做,因为我希望它适用于任何大小的任何数组。

for (unsigned i = 0; i < val; i++){
    if (a[i] == a[0])
        return true;
    else
        return false;
}
c++ arrays loops for-loop equality
5个回答
12
投票
for (unsigned i = 0; i < val; i++) {
    if (a[i] != a[0]) {
        return false;
    }
}
return true;

应该可以了。

在这种情况下,代码将立即因不匹配的值而失败。然而,对于匹配的值,它只是继续检查(正如我们所知,无论如何我们都需要测试数组的每个元素)。一旦完成,它就知道一切顺利(因为我们没有提前返回)并返回 true。


1
投票
#include <algorithm>
#include <vector>
#include <iostream>

int main(int argc, char** argv)
{
    std::vector<int> eq{ 1, 1, 1, 1 };
    std::vector<int> nq{ 1, 2, 1, 1 };

    bool eq_res = std::all_of(std::begin(eq), std::end(eq),
        [&eq](int c) -> bool
    {
        return eq[0] == c;
    });
    bool nq_res = std::all_of(std::begin(nq), std::end(nq),
        [&nq](int c) -> bool
    {
        return nq[0] == c;
    });

    std::cout << "eq: " << eq_res << std::endl;
    std::cout << "nq: " << nq_res << std::endl;
}

编译为 g++ --std=c++11 main.cpp


1
投票

只是为了好玩,使用 lambda 表达式

#include <algorithm>
using namespace std;

template<size_t N>
bool func(int (&arr)[N])
{
    int* pOddValue = std::find_if(begin(arr), end(arr), 
        [&] (int val){ return val != arr[0];});
    return pOddValue != end(arr);
}

0
投票

使用分而治之的方法,如果 n = 2^k ,我们可以减少与 n-1 的比较次数,如下所示:

bool divide(int arr[],int size)
{
    if( size == 2 ) return arr[0] == arr[1];

    if( divide(arr,size/2) && divide(arr+size/2,size/2) )
        return arr[0] == arr[size/2];

    return false;
}

另一种类似的方法:

for (unsigned i = 1; i < val; i++) {
    if (a[i] != a[i-1]) {
        return false;
    }
}
return true;

0
投票

看来不需要处理val = 0。 只需 1 行即可完成。

#include <functional>
#include <algorithm>
using namespace std;
return all_of(
    a+1, a+val,
    bind(equal_to<remove_pointer<decltype(a)>::type>(), a[0], placeholders::_1));
© www.soinside.com 2019 - 2024. All rights reserved.