Как проверить массив на условия в одну строчку?

У меня есть массив который имеет значение true и false

Инициализация

 const int numb = 3;
 bool time[numb]{};

 for (int i = 0; i < numb; ++i) {
  time[i] = тут карочи длинный код, он не важен, он выдает true то false, зависит от номера цикла и условия.

  // теперь что меня интересует, я делаю сейчас так, мне не очень удобно
  if(time[0] == true && time[1]  == true && time[2]  == true) {
      std::cout << i << " - i | " << " PFF " << "\n" << std::endl;
  }
  // я не могу сделать так, потому что мне нужно проверить все данные одновременно в каждом цикле.
  if(time[i]) {
      std::cout << i << " - i | " << " PFF 2 " << "\n" << std::endl;
  }
 
  // еще интересует проверка по последовательности, типа проверять по началу все, потом на одну меньше потом еще на одну меньше и так до конца.
  // например это выглядит так
  if(проверить вначале 3 значения, потом 2, потом 1) {
      std::cout << i << " - i | " << " PFF 3 " << "\n" << std::endl;
  }
}

В принципе это все, интересует только как коротко проверить все в условии if а не писать простыню кода, особенно если цифра будет больше 3.

Вот что я имею введу под последовательностью вложенности, я сделал пример основываясь на const int numb = 2 а то если будет 3 это уже слишком много, можно запутаться сейчас.

    if(time[0] == false && time[1]  == true) {
        std::cout << i << " - i | " << " XD :) 1 " << "\n" << std::endl;
        
        time[1] = false;

    }
    else if(time[0] == true && time[1]  == false) {
        std::cout << i << " - i | " << " XD :) 4 " << "\n" << std::endl;
       
        time[0] = false;
    }
    else if(time[0] == true && time[1]  == true) {
        
        std::cout << i << " - i | " << " XD :) 0 " << "\n" << std::endl;
       
        time[1] = false; // или time[0] = false

    }

Ответы (2 шт):

Автор решения: HolyBlackCat

Минимум два варианта:

  • std::all_of(std::begin(time), std::end(time), [](bool x){return x;}), или

  • std::find(std::begin(time), std::end(time), false) == std::end(time).

Это лучше сделать один раз перед циклом, и сохранить результат в булевую переменную.

Еще, вот это:

int numb = 3;
bool time[numb]{};

- не валидный C++. Или делайте const int numb = 3; (если размер известен во время компиляции), или меняйте массив на вектор: std::vector<bool> time(3);.

→ Ссылка
Автор решения: Harry

Т.е. вам просто нужно убедиться, что ВСЕ значения массива time[] истинны?

Что-то типа

if (all_of(begin(time),end(time),[](bool t) { return t;}))

вас устроит?

Можно и так:

if (!any_of(begin(time),end(time),[](bool t) { return !t;}))
→ Ссылка