2017-01-31 13 views
0

最も効率的な方法でブール演算子を使用して配列内のすべての項目を比較したいと考えています。配列内のすべての要素間の論理演算

bool myFunction(int i) 
{ 

    bool *myArray = {true, true, false, false, true}; 
    //suppose we know that i = 5 and that i is the length of the array... 
    return myArray[0] && myArray[1] && myArray[2] && myArray[3] && myArray[4]; 
} 

配列のサイズが固定されていないので、「I」の値を変更することができますし、私のreturn文は、もはや作業していないことになるので、私は何かを実装する必要があります:現在、私はこのような何かを持っています前の2から保存された結果とforループを作り、各要素を通過すると、リスト内の次の項目の値を比較するよりも、この他を行うには良い方法があった場合には、この

bool myFunction(int i) 
{ 
    bool *myArray = //some other array of bools 
    //should work with any value of i 
    bool result = myArray[0]; 
    for (int a = 1; a < i; ++a) 
    { 
     result &= myArray[i]; 
    } 
    return result; 
} 

ように私は思っていましたアイテム。これを簡単にするビット演算子のように、ループを取り出すものがあります。

+4

最初のもの:標準のC++にはVLAがありません。 – SergeyA

+0

私の悪いハハ、まだこの言語に新しい:S –

+0

ここにいくつかの良い答えがあります:http:// stackoverflow。com/questions/20590733/check-if-value-exist-all-indexes-of-array –

答えて

0

boost::dynamic_bitsetを使用できます。このビットセット内のビットが設定されている場合はtrueを返すメンバーfuction any()があります。ビットが設定されていない場合、none()trueを返します。

しかしany()の実装は次のとおりです。

template <typename Block, typename Allocator> 
bool dynamic_bitset<Block, Allocator>::any() const 
{ 
    for (size_type i = 0; i < num_blocks(); ++i) 
     if (m_bits[i]) 
      return true; 
    return false; 
} 

ですから、forループの内側にあります!

しかし、並列コンピューティングのようなものを探しているのであれば、arrayfire: を使用するとよいでしょう。たとえば、それにはalgorithmがあります。

template<typename T > 
T af::allTrue( const array & in ) 
//C++ Interface for checking if all values in an array are true. 
+0

問題の定義方法によります。質問は、データ構造がboolの配列であることを指定しているので、これは変更可能であると仮定しています。ループを避けることが目的ならば、これは隠すことだけです。 –

+0

@MarkAdelsbergerおかげさまで編集されました! – Rama

0

はおそらく&=は論理演算子ではないことを知っておく必要があります。それは "ビット単位の"演算子です。あなたがブール値でしか使用しない限り、それはうまくいくと思います。しかし、Cは1または0以外の値が配列に入るのを止めないので、おそらくその前提をしてはいけません。意味論的に論理をやっている場合、または&の代わりに&&が必要な場合。

これは、間違いなく、ショートサーキットを使用して、自分が行っていることを洗練することができます。単一の0(偽)を見つけたら、それ以降は集約を1(真)に戻すことはないので、停止することもできます。

for (int a = 1; result && a < i; ++a) 
{ 
    result &= myArray[i]; 
} 

これ以外にも、改善はほとんどありません。なぜループを回避しているのかわかりませんが、未知数の値を結合したい場合は、反復処理を行う必要があります。あなたはそれを行うためのユーティリティ関数を見つけ出すかもしれませんが、内部的にはループを使用しています。 (それがネイティブにあなたが望むものを実行するベクトルプロセッサを利用しようとしない限り...多分それは無意味であり、本当に値の数に制限がないなら、はまだにループを伴います。)

0

あなたはできるだけ早くあなたがfalseが発生したとして、ループを終了することができます

for (int a = 0; a < i; a++) 
{ 
    if (!myArray[i]) 
     return false; 
} 
return true; 

をあなたは、配列の最後の値を変更することが許可されている場合は、ここでそれを最適化するためのトリックだ:

配列の最後の値が falseある場合
  • 、その後、戻るfalse
  • 書き込み配列の最後のエントリ
  • 反復配列へあなたが前に、最後のエントリをを停止した場合は、その後、false
  • リターンを返す配列
  • で最後のエントリにfalse
  • 書き込みtrueに遭遇するまで、 true

コード:

int a; 
if (!myArray[i-1]) 
    return false; 
myArray[i-1] = false; 
for (a = 0; a < i; a++) 
{ 
    if (!myArray[i]) 
     break; 
} 
myArray[i-1] = true; 
return a != i-1; 

これは、反復ごとに2つの分岐の代わりに、反復ごとに1つの分岐を生成します。


あなたがi+1エントリを割り当てることが許されている場合は、「最後のエントリスワッピング」の部分を取り除くことができます:あなたはまた、myArray[i]に埋め込まれた付加算術を取り除くことができます

int a; 
myArray[i] = false; 
for (a = 0; myArray[i]; i++); 
return a != i; 

bool *arrayPtr; 
myArray[i] = false; 
for (arrayPtr = myArray; *arrayPtr; arrayPtr++); 
return arrayPtr != myArray+i; 

コンパイラがまだそれを適用していない場合、この関数は確実にそうします。一方、それは

0

あなたは、あなたがしたい場合はstd::end(myArray)std::begin(myArray) + iを置き換えるall_ofを(使用することができます...あなたが生成されたアセンブリコードでそれを確認する必要がありますので、ループを展開するようオプティマイザに難しくなるかもしれません配列全体ではなく最初のi要素)を確認してください。

#include <vector> 
#include <algorithm> 
bool myFunction(int i) 
{ 
    std::vector<bool> myArray = { true, true, false, false, true }; 
    return std::all_of(std::begin(myArray), std::begin(myArray) + i, [](bool elem) { return elem; }); 
} 
0

あなたが偽の値が発生した場合、継続して、代わりにインデックスのイテレータを使用しないように、私はあなたのために、ループの状態を変更します。

bool myFunction(int i) { 
    bool myArray[i] = //some other array of bools 
    //should workwith any value of i 

    bool result; 
    bool * a; 
    for (a = myArray, result = *a; a < myArray+i && result; result=*(++i)) {} 
    //no need to use the AND operator since we stop if we meet one false 

    return result; 
} 

それとも、本当にインデックスを好む場合:

bool myFunction(int i) { 
    bool myArray[i] = //some other array of bools 
    //should workwith any value of i 

    bool result; 
    unsigned int a; 
    for (a = 0, result = myArray[a]; a < i && result; result=myArray[++i]) {} 
    //no need to use the AND operator since we stop if we meet one false 

    return result; 
} 

は、たぶん私は間違っているんだけど、それは少し範囲操作ではない場合、私は(= &)ビット単位のAND割り当てを使用していないだろう、それは実際にboolタイプには関係ありません。