Как проверить массив на условия в одну строчку?
У меня есть массив который имеет значение 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 шт):
Минимум два варианта:
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);.
Т.е. вам просто нужно убедиться, что ВСЕ значения массива time[] истинны?
Что-то типа
if (all_of(begin(time),end(time),[](bool t) { return t;}))
вас устроит?
Можно и так:
if (!any_of(begin(time),end(time),[](bool t) { return !t;}))