2016-04-12 18 views
1

Bir sınıfın üyelerinden birine eklemek istediğim basit bir özellik var: Bazı boolean (2d) değerlerinin tümü için işlevden çıkmak istiyorum) dizi true. Ben öyle yapabilirsiniz 1d dizinin daha basit durumdaBir dizideki tüm değerler doğruysa bir işlev sonlandırılıyor

:

int SIZE = 10; 
std::vector<bool> myArray(SIZE, true); 
int i = 0; 
while(myArray[i] and i < SIZE){ 
    ++i; 
    } 
if(i == SIZE){ 
    return; 
    } 
// rest of the code for array not all true 

muhtemelen hayır bunu yapmak için daha hızlı bir yol (eksi marjinal optimizasyonlar) yoktur ama biraz çirkin buluyorum. Bunu yapmanın daha iyi yolları var mı?

=========================================

yılında Ben karar uç uygulamak için:

{ 
bool allTrue = true; 
for(int i = 0; i < SIZE1 and allTrue; ++i) 
    for(int j = 0; j < SIZE2 and allTrue; ++j) 
     allTrue &= myArray[i][j]; 
if(allTrue) 
    return; 
} 
+1

'std :: all_of' .. –

cevap

3

Sen <algorithm> den std::all_of kullanabilirsiniz:

if (std::all_of(myArray.begin(), myArray.end(), [](bool b) {return b;})) { 
    return; 
} 
+0

Nedir eğer' bool ** nesnesi? Örneğimde bir satırda başlatmak için bir "vektör" seçtim, fakat kodumda bir "bool **" kullandım. Std :: all (myArray [0] [0], myArray [Size1-1] [Size2-1]) 'yapabilir miyim? –

+1

Bir bool [N] [M] 'ile, std :: all_of (& myArray [0] [0], & myArray [N] [0], [] (bool b) {return b; }) '. Fakat bool ** ile, şöyle bir şey çağırmalısınız: std :: all_of (& myArray [0], & myArray [N], [M] (const bool * bs) {return std :: all_of (bs, bs) + M, [] (bool b) {return b;});}); – Jarod42

+0

Çok teşekkür ederim, işi halleder. –

0

olabilir ve-ing tüm değerleri? Bu şekilde:

bool r = true; 
for (int i=0; i<myArray.size() && r; i++) r &= myArray[i]; 
return r; 

Ya std::all_of senin Yineleyiciler ve lambdas aşina iseniz.

bir 2d vektör için
+0

Girdi için teşekkürler, belki bile en iyisi için myArray.size() ve r' örnek. –

0

, bunu yıkmak isteyebilirsiniz: çözümlerin

#include <vector> 
#include <algorithm> 


bool all_true(const std::vector<bool>& v) 
{ 
    return std::all_of(std::begin(v), std::end(v), [](const auto& b) { return b; }); 
} 

bool all_true(const std::vector<std::vector<bool>>& vv) 
{ 
    return std::all_of(std::begin(vv), std::end(vv), [](const auto& v) { 
    return all_true(v); 
    }); 
} 

void test() 
{ 
    std::vector< std::vector<bool> > d2 /* = initalise 2d vector */; 


    while(!all_true(d2)) 
    { 
    // things you want to do 
    } 


} 
1

Bir:

int my2Da[][2] = {{true, true},{true, true},{true, true}}; 
int *pa = my2Da[0]; 
bool flag=true; 
for (int i=0;flag && i<(sizeof my2Da)/(sizeof (int));flag &= pa[i++]); 
//flag indicates about the result 
+0

Teşekkür ederim, bir dizi '' düzleştirme '' için bu hileyi bilmiyordum, gelecekte yararlı olabilir. –

İlgili konular