c++ - operator - ¿Hay algo como “std:: and” o “std:: or”?
js var || (4)
¿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 evaluación de corto circuito?
Acabo de insertar sentencias de impresión en la lambda, y sí, ambas funciones realizan cortocircuito.
Dado un contenedor de valores booleanos (Un ejemplo es std::vector<bool>
), ¿existe 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?
www.cplusplus.com través de www.cplusplus.com esta mañana, pero no pude encontrar nada cerca.
Puede utilizar los objetos de función logical_and
y logical_or
junto con una reducción para lograrlo.
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 no es usar cortocircuitos (la función de accumulate
no sabe nada acerca de los cortocircuitos a pesar de que sí lo hacen los funtores), mientras que la solución inteligente de Igor es.
Se puede implementar por:
Y:
std::find(vector.begin(), vector.end(), false) == vector.end() // all the values are true
O:
std::find(vector.begin(), vector.end(), true) != vector.end() //at least one value is true
Si no necesita un algoritmo genérico para diferentes tipos de contenedores ...
Mientras busca una evaluación de cortocircuito, puede darle una oportunidad a std :: valarray. Para and
use valarray::min() == true
para or
puede usar std::find
como lo menciona Igor.
En caso de que sepa la cantidad de elementos para almacenar en tiempo de compilación, incluso podría usar un std :: bitset:
bitset<100> container();
//... fill bitset
bool or = container.any();
bool and = container.count() == container.size();