私がしたいことは、3つ以上がtrueに設定されているかどうかをboolの配列で調べることです。私がこれを行うと考えることができる唯一の方法は、10のboolが存在するため、たくさんの可能な組み合わせごとにifステートメントを使用することです。誰でもこれを行うにはどのように最善の方法に関する提案があります。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;
配列の場合、それをループして、数を数えます。しかし、私はある種のビットパターンを意味するのでしょうか?
理由だけtruesの数をカウントして、数が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
問題が見つかった後でも数え続けます問題があるなら、私はシャープトゥースの方法を使うだろう。
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);
を働いていたよりも、他のみんなが、これは私が名前空間stdを使用して使用する必要があり、もしそうなら、私はまだ使用できることを意味していてくれてありがとう私の現在の名前空間を使用しています。 – 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
フラグの数をカウントしたい、パターンを探していることを前提としています。
真に設定されたブールの数を数えて配列をループするだけです。
/**
* @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に設定するときはいつでも、グローバルカウンタをインクリメントすることができます。これは最も簡単な方法です。コード内の任意のポイントで、グローバル配列は、配列内の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))
char?またはCHAR?いずれにせよ、それは8ビットです。 http://msdn.microsoft.com/en-us/library/aa505945.aspx –
はい、これは8ビットです。私は、Unicode文字を保持するためにcharが16ビットであるJavaライン上にいました。指摘してくれてありがとう:-) –
- 1. 角度配列の値を確認してください
- 2. 一度に1つの配列要素を追加してNumpy配列のQuotientを確認する
- 3. 配列内の値を確認する
- 4. すべてのJavascript配列を一度に拡張する
- 5. C#配列内の値を確認する
- 6. 配列から未確認の値を取り除きます。角度js
- 7. 配列に対する値を確認してください。
- 8. セル配列のすべての値を数値配列にダンプします
- 9. フラグビットjavaのすべての値を確認します。Android
- 10. ジュリアアレイのすべての値を確認しますか?
- 11. 配列を渡して値を確認する
- 12. 配列を使用して数値入力を確認する
- 13. 変数の配列を持つ列の値を確認する
- 14. char配列をすべて0の値に設定します(C言語)
- 15. 値のすべてのテーブルの列を確認してください
- 16. FCMは一度に最大49のプッシュ通知をアンドロイドデバイスに送信しますが、すべてのメッセージの配信確認を送信します
- 17. Jquery:配列のオブジェクトと入力値を比較し、正確に一致するかどうかを確認
- 18. オブジェクトに配列内のすべてのキーが含まれていることを確認します
- 19. 配列のリストを使用してオブジェクトの配列に存在する値を確認する
- 20. 二次元配列内の値に応じて、別の単一配列をCのバイナリに変換します
- 21. スキャナで配列の文字列値を確認する方法
- 22. オブジェクトの配列の一意性を確認する
- 23. BASHが配列に値を格納し、各値の差を確認する
- 24. 配列に値が存在するかどうかを確認し、配列に値があるかどうかを確認します。
- 25. カラムの値をすべて確認してください
- 26. VBA配列複数の値を一度にコピーする
- 27. 配列の共有値を一度に初期化する
- 28. PHP:入れ子になったすべての配列の重複値を確認する
- 29. c# - 一度にすべての変数を明示的に入力します
- 30. c#&GetAsyncKeyState() - すべてのキーを確認するには?
それは、whileループの中にあったので、答えを少し編集しなければならなかった助けたが、それは完全に – bobthemac