2012-01-11 3 views
2

私がしたいことは、3つ以上がtrueに設定されているかどうかをboolの配列で調べることです。私がこれを行うと考えることができる唯一の方法は、10のboolが存在するため、たくさんの可能な組み合わせごとにifステートメントを使用することです。誰でもこれを行うにはどのように最善の方法に関する提案があります。C++一度にすべての配列の値を確認します

+0

それは、whileループの中にあったので、答えを少し編集しなければならなかった助けたが、それは完全に – 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

理由だけtruesの数をカウントして、数が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 

問題が見つかった後でも数え続けます問題があるなら、私はシャープトゥースの方法を使うだろう。

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

あなたの目的のために、あなたはでしょう:私は、おそらくあなたはそれが役に立つでしょう、私の個人的なライブラリのstd::all_of/any_of/none_ofのスタイルでアルゴリズムをファッションにしました

サイドノート

n_or_more_of(bool_array, std::end(bool_array), [](bool b) { return b; }, 3); 
+0

を働いていたよりも、他のみんなが、これは私が名前空間stdを使用して使用する必要があり、もしそうなら、私はまだ使用できることを意味していてくれてありがとう私の現在の名前空間を使用しています。 – 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

真に設定されたブールの数を数えて配列をループするだけです。

/** 
* @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); 
0

整数のビットとしてboolsを格納ようにそれを呼び出します。その後、bit twiddling hacksのいずれかを適用します。

1

配列要素をTRUEに設定するときはいつでも、グローバルカウンタをインクリメントすることができます。これは最も簡単な方法です。コード内の任意のポイントで、グローバル配列は、配列内のTRUE要素の数を示します。

もう1つのこと - 最大32のブール値を保持している場合は、1つの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ビットです。私は、Unicode文字を保持するためにcharが16ビットであるJavaライン上にいました。指摘してくれてありがとう:-) –

関連する問題