2011-06-28 6 views
19

względu pojemnik wartości logicznych (Przykładem jest std::vector<bool>) ma standardową funkcja zwraca true jeżeli wszystkie wartości true („a”) lub true, jeśli co najmniej jedna wartość jest true („i”), z ewaluacja zwarć?Czy jest coś takiego jak "std :: and" lub "std :: or"?

Dziś rano kopałem koryto www.cplusplus.com, ale nie mogłem znaleźć niczego blisko.

+0

można łatwo zaimplementować własną ... – Dani

+8

@Dani: Rzeczywiście. Ale nawet jeśli kod jest banalny, jeśli istnieje coś, co już istnieje, dlaczego miałbym go przepisać? – ereOn

+0

@ereOn, rzeczy, które można łatwo zaimplementować, nie przechodzą w C++. jeśli chcesz, spróbuj C# lub nawet tłumacza. – Dani

Odpowiedz

37

można realizować przez:

oraz:

std::find(vector.begin(), vector.end(), false) == vector.end() // all the values are true 

OR:

std::find(vector.begin(), vector.end(), true) != vector.end() //at least one value is true 
+1

Cóż, czasami myślę, że szukam zbyt mocno ... I mogę nawet użyć 'find_if' z obiektem funkcji, jeśli potrzebuję wykonać bardziej skomplikowaną kontrolę wartości. Dziękuję Ci bardzo ! – ereOn

+3

+1 To sprytnie! – fredoverflow

+0

Przyjąłem odpowiedź FredOverflow, ponieważ jego rozwiązanie jest prostsze. Wzniesiono go dla uczciwości i dlatego, że jest naprawdę sprytny. – ereOn

10

Można użyć funkcji obiektów logical_and i logical_or w połączeniu ze zmniejszeniem do zrealizuj to.

accumulate oblicza redukcję. Stąd:

bool any = std::accumulate(foo.begin(), foo.end(), false, std::logical_or); 
bool all = std::accumulate(foo.begin(), foo.end(), true, std::logical_and); 

Zastrzeżenie: to nie użyciu zwarcia (funkcja accumulate wie nic o zwarcie chociaż funktory zrobić), a mądry to rozwiązanie Igora.

+1

Co powiesz na 'std :: accumulate' dla redukcji? – ltjax

+1

@ltjax Duh [...] (http://example.com) –

+0

+1. Nie wiedziałem o tych funkcjach. Dzięki. – ereOn

43

ma standardową funkcja zwraca prawdziwe, jeżeli wszystkie wartości są prawdziwe („i”)

std::all_of(vec.begin(), vec.end(), [](bool x) { return x; }) 

lub prawdziwe, jeśli co najmniej jedna wartość jest prawdziwe („i”)

std::any_of(vec.begin(), vec.end(), [](bool x) { return x; }) 

z krótkim evalutation obwodu?

Właśnie wstawiłem instrukcje drukowania do lambda, i tak, obie funkcje wykonują zwarcie.

+0

+1. Wiedziałem, że zostanie to dodane pewnego dnia. Niestety nie mogę teraz używać C++ 0x w moim projekcie, ale dobrze o tym wiedzieć. Dziękuję Ci. – ereOn

+1

@ereOn: ja też nie mogę (w pracy), więc poszedłem do przodu i stworzył je (oczywiście nie w std przestrzeni nazw), aby pomóc w przyszłej migracji :) –

+0

jak @Morwenn powiedział, że brakuje Jednodniowego orzecznika –

1

Jeśli nie trzeba ogólny algorytm dla różnych typów kontenerów ...

Jak szukasz oceny zwarcia, można dać std :: valarray szansę. Dla and użyć valarray::min() == true dla można użyć std::find, jak wspomniano przez Igor.

W przypadku znasz liczba elementów do przechowywania w czasie kompilacji, można nawet użyć std :: bitset:

bitset<100> container(); 

//... fill bitset 

bool or = container.any(); 
bool and = container.count() == container.size();