2012-01-11 4 views
2

что я хочу сделать, это проверить массив bools, чтобы узнать, установлено ли 3 или более из них true. Единственный способ, которым я могу это сделать, - использовать оператор if для каждой возможной комбинации, из которой есть много, потому что есть десять bools. Доза у кого-нибудь есть предложения о том, как лучше всего это сделать.C++ проверить все значения массива сразу

+0

Спасибо Ребята, которые помогли пришлось изменить Ответ на этот вопрос немного, потому что он был внутри цикла в то время, но кроме того, что она работала отлично – bobthemac

ответ

8

Намного проще всего было бы перебрать массив:

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; 
0

Если это массив, то, что вы делаете, это цикл над ним и подсчет количества прав. Но, боюсь, вы имеете в виду какой-то битформат?

0

Почему не просто посчитать количество истин, а затем сделать что-то, если число 3 или выше:

int sum = 0; 
for (int i = 0; i < length; i++){ 
    if (arr[i]){ 
    sum++; 
    } 
} 

if (sum >= 3){ 
    // do something... 
} 
10

Это было бы самым простым способом:

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); 
+0

это значит, что мне нужно использовать с помощью патезрасе, и если да, могу ли я использовать мой текущий использование пространства имен tle. – bobthemac

+0

@bobthemac: Если вы собираетесь использовать что-то из стандартной библиотеки, то вы либо префикс его с помощью 'std ::', как я сделал выше. Или у вас есть объявление 'using' в вашем файле. –

0

Вы можете прокручивать и создавать представление битовой маски массив, то вы можете сравнить с до 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 флагов в массиве.

0

Просто проведите цикл по массиву, подсчитывая количество балов, установленных в 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); 
1

Всякий раз, когда вы устанавливаете элемент массива в значение 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)) 
+0

char? или CHAR? В любом случае, это 8 бит. http://msdn.microsoft.com/en-us/library/aa505945.aspx –

+0

Да, это 8 бит, я был в строке Java, где char - 16 бит, для хранения символов Unicode. Спасибо, что указали :-) –

Смежные вопросы