C++ 如何检查数组中的元素是否相等?

3
我正在尝试编写一个程序,使用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;
    }

假设这是一个函数,它将在第一次循环时返回。它不会检查数组中的所有其他项。 - Astinog
1
我建议检查这个链接。https://dev59.com/j2Yq5IYBdhLWcg3w4Edx祝好运。 - RIO
相等关系具有传递性。如果a == b且b == c,则a == c。 如果您的关系不满足这一点,则它不是真正的相等关系。 - David Heffernan
这可能是 https://dev59.com/dm_Xa4cB1Zd3GeqP6eqI 的重复。只需使用指针而不是迭代器即可。 - pzelasko
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Don Reba
@DonReba 那就不是属性相等了。浮点数的问题在于 nan,因为 nan != nan。但是如果排除 nan,浮点数相等就是真正的等价关系。 - David Heffernan
5个回答

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

那应该就可以了。

在这种情况下,如果值不匹配,代码会立即失败。然而,如果值匹配,它只是继续检查(因为我们知道无论如何都需要测试数组的每个元素)。一旦完成这个过程,它知道一切都进行得很好(因为我们没有提前返回),然后返回true。


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);
}

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 进行编译


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。 你可以用一行代码解决。

#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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接