【问题标题】:Check if all boolean values in an array is true?检查数组中的所有布尔值是否为真?
【发布时间】:2021-03-12 09:59:50
【问题描述】:

假设我有这个布尔数组:

bool something[4] = {false, false, false, false};

现在,有没有什么简单的方法可以同时检查这个数组中的所有值是否为真/假?

不要这样做:

if(something[0] == false && something[1] == false..)
dothis();

【问题讨论】:

  • 使用循环。就像上面的副本一样。
  • 这个问题不应该被关闭,它比替代方案更具体。

标签: c++ arrays


【解决方案1】:

使用 for 循环。

allTrue = true;
allFalse = true;
for(int i=0;i<something.size();i++){
    if(something[i]) //a value is true
        allFalse = false; //not all values in array are false
    else //a value is false
        allTrue = false; //not all values in array are true
}

我的语法可能有点不对劲(有一段时间没用过 C++),但这是一般的伪代码。

【讨论】:

    【解决方案2】:

    使用std::all_of

    #include<algorithm>
    ...
    if (std::all_of(
          std::begin(something), 
          std::end(something), 
          [](bool i)
                { 
                  return i; // or return !i ;
                }
    )) {
          std::cout << "All numbers are true\n";
    }
    

    【讨论】:

    • @Salgar 是的,他们是。 bool 是一个整数类型 -> 它是一个数字。
    • 我明白,他编辑了他的答案。以前很奇怪。
    • 很高兴指出 all_of 仅在 C++11 上定义...
    • 只想添加一个带指针的方法:std::all_of(something, &amp;something[4], [](bool b) {return b;});
    【解决方案3】:

    你可以通过求和来做到这一点:

    #include <numeric> 
    
    int sum = std::accumulate(bool_array, bool_array + 4, 0);
    if(sum == 4) /* all true */;
    if(sum == 0) /* all false */;
    

    这具有一次性找到两个条件的优势,不像all_of 的解决方案需要两个。

    【讨论】:

    • 如果数组有数百万个布尔值,第一个为 false 并且需要检查所有 true 呢? std::all_of 只使用std::find_if_not
    • @P0W:我假设问题是找到两个条件,而不是任何一个条件
    • 如果前两个元素分别为真和假,您仍然不需要遍历整个数组的任何一个条件..
    【解决方案4】:

    您可以搜索第一个错误标志:

    bool something[n];
    ...
    
    bool allTrue = (std::end(something) == std::find(std::begin(something),
                                                     std::end(something),
                                                     false) );
    

    【讨论】:

    • 这对七年前的公认答案有何影响?
    • @DevSolar 这是一种不同的方法。与 std::all_of 类似,但不同。另外它不需要 lambda。
    猜你喜欢
    • 2013-09-09
    • 2023-03-13
    • 2012-01-05
    • 1970-01-01
    • 2019-08-07
    • 2019-05-22
    • 2013-09-18
    • 2019-05-22
    相关资源
    最近更新 更多