script operator assignment c++ algorithm boolean std short-circuiting

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();