что я хочу сделать, это проверить массив bools, чтобы узнать, установлено ли 3 или более из них true. Единственный способ, которым я могу это сделать, - использовать оператор if для каждой возможной комбинации, из которой есть много, потому что есть десять bools. Доза у кого-нибудь есть предложения о том, как лучше всего это сделать.C++ проверить все значения массива сразу
ответ
Намного проще всего было бы перебрать массив:
int numberOfSet = 0;
for(int i = 0; i < sizeOfArray; i++) {
if(array[i]) {
numberOfSet++;
//early cut-off so that you don't loop further without need
// whether you need it depends on how typical it is to have
// long arrays that have three or more elements set in the beginning
if(numberOfSet >= 3) {
break;
}
}
}
bool result = numberOfSet >= 3;
Если это массив, то, что вы делаете, это цикл над ним и подсчет количества прав. Но, боюсь, вы имеете в виду какой-то битформат?
Почему не просто посчитать количество истин, а затем сделать что-то, если число 3 или выше:
int sum = 0;
for (int i = 0; i < length; i++){
if (arr[i]){
sum++;
}
}
if (sum >= 3){
// do something...
}
Это было бы самым простым способом:
std::count(bool_array, std::end(bool_array), true) >= 3
Только проблема заключается в том, что он ведет учет даже после того, как он нашел 3. Если это является проблемой, тогда я бы использовал метод sharptooth.
примечание стороны
Я решил вылепить алгоритм в стиле std::all_of/any_of/none_of
для моей личной библиотеке, возможно, вы найдете его полезным:
template<typename InIt, typename P>
bool n_or_more_of(InIt first, InIt last, P p, unsigned n)
{
while (n && first != last)
{
if (p(*first)) --n;
++first;
}
return n == 0;
}
Для ваших целей, вы бы используйте его следующим образом:
n_or_more_of(bool_array, std::end(bool_array), [](bool b) { return b; }, 3);
это значит, что мне нужно использовать с помощью патезрасе, и если да, могу ли я использовать мой текущий использование пространства имен tle. – bobthemac
@bobthemac: Если вы собираетесь использовать что-то из стандартной библиотеки, то вы либо префикс его с помощью 'std ::', как я сделал выше. Или у вас есть объявление 'using' в вашем файле. –
Вы можете прокручивать и создавать представление битовой маски массив, то вы можете сравнить с до CHAR_BIT * sizeof (unsigned long)
параллельно:
unsigned long mask = 0;
for (std::vector<bool>::const_iterator it = flags.begin(), end_it = flags.end();
it != end_it;
++it)
{
if (*it)
mask |= (1 << (it - flags.begin()));
}
if (mask & (0xaa3)) // or whatever mask you want to check
{
}
Это предполагает, что вы ищете моделей, а не просто хотите, чтобы подсчитать количество true
флагов в массиве.
Просто проведите цикл по массиву, подсчитывая количество балов, установленных в true.
/**
* @param arr The array of booleans to check.
* @param n How many must be true for this function to return true.
* @param len The length of arr.
*/
bool hasNTrue(bool *arr, int n, int len) {
int boolCounter;
for(int i=0; i<len; i++) {
if (arr[i]) boolCounter++;
}
return boolCounter>=n;
}
Затем вызовите его, как так
hasNTrue(myArray, 3, myArrayLength);
Храните Bools как биты в виде целого числа. Затем примените один из bit twiddling hacks.
Всякий раз, когда вы устанавливаете элемент массива в значение TRUE, вы можете увеличить глобальный счетчик. Это будет самый простой способ. В любой точке вашего кода глобальный массив укажет вам количество ИСТИННЫХ элементов в массиве.
Другое дело - если вы сохраняете до 32 значений bool, вы можете использовать одну переменную int. int - 32 бита (в Win32), и вы можете сохранить 32 bool.
char x = 0; // 00000000 // char is 8 bits
// TO SET TRUE
x = x | (1 << 4); // 00010000
x = x | (1 << 7); // 10010000
// TO SET FALSE
x = x & ~(1 << 4); // 10010000 & 11101111 => 10000000
// TO CHECK True/False
if(x & ~(1 << 4))
char? или CHAR? В любом случае, это 8 бит. http://msdn.microsoft.com/en-us/library/aa505945.aspx –
Да, это 8 бит, я был в строке Java, где char - 16 бит, для хранения символов Unicode. Спасибо, что указали :-) –
- 1. Используя все значения массива все сразу?
- 2. проверить значения массива
- 3. Проверка всех значений массива сразу
- 4. Проверить одинаковые значения массива
- 5. php - как проверить значения многоэлементного массива - все равны нулю?
- 6. проверить все значения столбца
- 7. Как stripslashes все элементы массива сразу?
- 8. проверить, содержит ли массив все значения массива из другого массива в C
- 9. Изменить все значения массива
- 10. печать все значения массива
- 11. emberjs сразу получает все поля/значения формы
- 12. Выделить все ячейки сразу выше предельного значения
- 13. Лучший способ проверить, находятся ли все значения массива в диапазоне
- 14. Bash: проверить, что все значения ассоциативного массива равны
- 15. Как проверить, равны ли все значения массива 0?
- 16. удаляет все вхождения заданного значения в несколько массивов сразу
- 17. Проверить все colums для значения
- 18. проверить все значения, соответствующие прототипу
- 19. Проверить все значения в столбце
- 20. Как проверить, равны ли все значения ячеек
- 21. Как умножить все элементы массива сразу без итерации в php?
- 22. Ввод чисел внутри массива сразу в C
- 23. my While цикл выполняет все сразу (C#)
- 24. Получить все Определения сразу в C#
- 25. makefiles - скомпилировать все файлы c сразу
- 26. C# как проверить, видны ли все элементы массива
- 27. Как проверить, если все элементы массива больше нуля C++
- 28. Как назвать все значения массива
- 29. Quotes все значения массива объектов
- 30. рекурсивно найти все значения массива
Спасибо Ребята, которые помогли пришлось изменить Ответ на этот вопрос немного, потому что он был внутри цикла в то время, но кроме того, что она работала отлично – bobthemac