c ++一次检查所有数组值

时间:2012-01-11 15:30:42

标签: c++ arrays boolean

我想要做的是检查bool数组以查看其中3个或更多是否已设置为true。我能想到的唯一方法就是为每个可能的组合使用if语句,因为有十个bool。任何人都有关于如何做到这一点的任何建议。

8 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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;

答案 2 :(得分:1)

无论何时将数组元素设置为TRUE值,都可以增加全局计数器。这将是最简单的方法。在代码中的任何一点,全局数组都会告诉你数组中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) )

答案 3 :(得分:0)

如果它是一个数组,你所做的就是遍历它并计算真实数量。但是,我担心你的意思是某种形式,对吗?

答案 4 :(得分:0)

为什么不计算真实数量,然后在数字为3或更高时执行某些操作:

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

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

答案 5 :(得分: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个标志的数量。

答案 6 :(得分:0)

只需循环遍历数组,将bool的数量设置为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);

答案 7 :(得分:0)

将bools存储为整数位。然后应用其中一个bit twiddling hacks