2011-06-28 21 views
19

dar un recipiente de valores booleanos (un ejemplo es std::vector<bool>), hay una función estándar que devuelve true si todos los valores son true ("y") o true si al menos un valor es true ("o"), con evaluación de cortocircuito?¿Hay algo como "std :: and" o "std :: or"?

He cavado a través de www.cplusplus.com esta mañana, pero no he podido encontrar nada cerca.

+0

Se puede implementar fácilmente su propio ... – Dani

+8

@Dani: En efecto. Pero incluso si el código es trivial, si hay algo que ya existe, ¿por qué debería reescribirlo? – ereOn

+0

@ereOn, las cosas que se implementan fácilmente no entran en C++. si quieres, prueba C# o incluso algún intérprete. – Dani

Respuesta

37

Puede implementar por:

Y:

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

Bueno, a veces creo que estoy buscando demasiado ... Incluso puedo usar 'find_if' con un objeto de función si necesito realizar una comprobación más complicada de los valores. Muchas gracias ! – ereOn

+3

+1 ¡Eso es inteligente! – fredoverflow

+0

Acepté la respuesta de FredOverflow porque su solución es más directa. Apoyado este por la justicia y porque es realmente inteligente. – ereOn

10

puede utilizar objetos de la función de logical_and y logical_or en conjunción con una reducción de lograr eso.

accumulate calcula la reducción. Por lo tanto:

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

Advertencia: esto es no usando un cortocircuito (la función accumulate sabe nada acerca de un cortocircuito a pesar de que los funtores hacen), mientras que la solución inteligente de Igor es.

+1

¿Qué tal 'std :: accumulate' para la reducción? – ltjax

+1

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

+0

+1. No estaba al tanto de estas funciones. Gracias. – ereOn

43

hay una función estándar que devuelve verdadero si todos los valores son verdaderos ("y")

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

o verdadero si al menos un valor es verdadero ("o")

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

con evalutation cortocircuito?

Acabo de insertar declaraciones de impresión en la lambda, y sí, ambas funciones realizan un cortocircuito.

+0

+1. Sabía que esto se agregaría algún día. Desafortunadamente, no puedo usar C++ 0x en este momento en mi proyecto, pero es bueno saberlo. Gracias. – ereOn

+1

@ereOn: tampoco puedo (en el trabajo), así que seguí y los creé (no en el espacio de nombres estándar, por supuesto) para ayudar con la migración futura :) –

+0

como @Morwenn dijo que falta Unary Predicate –

1

Si no es necesario un algoritmo genérico para diferentes tipos de contenedores ...

Como usted está buscando para la evaluación de corto circuito, puede dar std :: valarray una oportunidad. Para and use valarray::min() == true para or puede usar std::find como lo menciona Igor.

En caso de que conoce el número de elementos para almacenar en tiempo de compilación, incluso se podría utilizar un std :: bitset:

bitset<100> container(); 

//... fill bitset 

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