std::find, std::find_if, std::find_if_not
Definido en el archivo de encabezado <algorithm>
|
||
(1) | ||
template< class InputIt, class T > InputIt find( InputIt first, InputIt last, const T& value ); |
(hasta C++20) | |
template< class InputIt, class T > constexpr InputIt find( InputIt first, InputIt last, const T& value ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt, class T > ForwardIt find( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, |
(2) | (desde C++17) |
(3) | ||
template< class InputIt, class UnaryPredicate > InputIt find_if( InputIt first, InputIt last, |
(hasta C++20) | |
template< class InputIt, class UnaryPredicate > constexpr InputIt find_if( InputIt first, InputIt last, |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt, class UnaryPredicate > ForwardIt find_if( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, |
(4) | (desde C++17) |
(5) | ||
template< class InputIt, class UnaryPredicate > InputIt find_if_not( InputIt first, InputIt last, |
(desde C++11) (hasta C++20) |
|
template< class InputIt, class UnaryPredicate > constexpr InputIt find_if_not( InputIt first, InputIt last, |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt, class UnaryPredicate > ForwardIt find_if_not( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, |
(6) | (desde C++17) |
Devuelve un iterador al primer elemento en el rango [first, last) que satisface criterios específicos:
find
busca un elemento igual a value
.find_if
busca un elemento para el que el predicado p
devuelve true.find_if_not
busca un elemento para el que el predicado p
devuelve false.policy
. Estas sobrecargas no participan en la resolución de sobrecarga a menos que std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> (hasta C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> (desde C++20) sea verdadera.Contenido |
[editar] Parámetros
first, last | - | El rango de los elementos a examinar. |
value | - | Valor con el que comparar los elementos. |
policy | - | La política de ejecución a usar. Véase política de ejecución para más detalles. |
p | - | Predicado unario que devuelve true para el elemento requerido. La expresión p(v) debe ser convertible a bool para cada argumento |
q | - | Predicado unario que devuelve false para el elemento requerido. La expresión q(v) debe ser convertible a bool para cada argumento |
Requisitos de tipo | ||
-InputIt debe satisfacer los requisitos de InputIterator.
| ||
-ForwardIt debe satisfacer los requisitos de ForwardIterator.
| ||
-UnaryPredicate debe satisfacer los requisitos de Predicate.
|
[editar] Valor de retorno
Iterador al primer elemento que cumple la condición o un iterador igual a last
si no se encuentra dicho elemento.
[editar] Complejidad
A lo sumo N
aplicaciones del predicado, donde N = std::distance(first, last).
[editar] Excepciones
Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy
(política de ejecución) reportan errores tales que:
- Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y la política de ejecución es una de las tres políticas estándar, se llama a std::terminate. Para cualquier otra política de ejecución, el comportamiento está definido por la implementación.
- Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.
[editar] Posible implementación
Primera versión |
---|
template<class InputIt, class T> constexpr InputIt find(InputIt first, InputIt last, const T& value) { for (; first != last; ++first) { if (*first == value) { return first; } } return last; } |
Segunda versión |
template<class InputIt, class UnaryPredicate> constexpr InputIt find_if(InputIt first, InputIt last, UnaryPredicate p) { for (; first != last; ++first) { if (p(*first)) { return first; } } return last; } |
Tercera versión |
template<class InputIt, class UnaryPredicate> constexpr InputIt find_if_not(InputIt first, InputIt last, UnaryPredicate q) { for (; first != last; ++first) { if (!q(*first)) { return first; } } return last; } |
[editar] Notas
Si no tienes C++11, un equivalente a std::find_if_not
es usar std::find_if
con el predicado negado.
template<class InputIt, class UnaryPredicate> InputIt find_if_not(InputIt first, InputIt last, UnaryPredicate q) { return std::find_if(first, last, std::not1(q)); } |
[editar] Ejemplo
El siguiente ejemplo encuentra números enteros en un vector dado.
#include <iostream> #include <algorithm> #include <vector> #include <iterator> int main() { std::vector<int> v{1, 2, 3, 4}; int n1 = 3; int n2 = 5; auto es_par = [](int i){ return i%2 == 0; }; auto resultado1 = std::find(begin(v), end(v), n1); auto resultado2 = std::find(begin(v), end(v), n2); auto resultado3 = std::find_if(begin(v), end(v), es_par); (resultado1 != std::end(v)) ? std::cout << "v contiene " << n1 << '\n' : std::cout << "v no contiene " << n1 << '\n'; (resultado2 != std::end(v)) ? std::cout << "v contiene " << n2 << '\n' : std::cout << "v no contiene " << n2 << '\n'; (resultado3 != std::end(v)) ? std::cout << "v contiene un número par: " << *resultado3 << '\n' : std::cout << "v no contiene números pares\n"; }
Salida:
v contiene 3 v no contiene 5 v contiene un número par: 2
[editar] Véase también
Encuentra dos elementos contiguos idénticos (o que satisfagan un predicado dado). (plantilla de función) | |
Encuentra la última secuencia de elementos en un cierto rango. (plantilla de función) | |
Busca por cualquiera de un conjunto de elementos. (plantilla de función) | |
Encuentra la primera posición donde dos rangos difieren. (plantilla de función) | |
Busca una subsecuencia de elementos. (plantilla de función) | |
(C++20)(C++20)(C++20) |
Encuentra el primer elemento que satisfaga un criterio específico. (niebloid) |