Namespaces
Variants

std::find, std::find_if, std::find_if_not

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenación y relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <algorithm>
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
(1) (constexpr desde C++20)
(hasta C++26)
template< class InputIt, class T = typename std::iterator_traits
                                       <InputIt>::value_type >
constexpr InputIt find( InputIt first, InputIt last, const T& value );
(desde C++26)
template< class InputIt, class UnaryPred >
InputIt find_if( InputIt first, InputIt last, UnaryPred p );
(2) (constexpr desde C++20)
template< class InputIt, class UnaryPred >
InputIt find_if_not( InputIt first, InputIt last, UnaryPred q );
(3) (desde C++11)
(constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt find( ExecutionPolicy&& policy,
                ForwardIt first, ForwardIt last, const T& value );
(4) (desde C++17)
(hasta C++26)
template< class ExecutionPolicy,
          class ForwardIt, class T = typename std::iterator_traits
                                         <ForwardIt>::value_type >
ForwardIt find( ExecutionPolicy&& policy,
                ForwardIt first, ForwardIt last, const T& value );
(desde C++26)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if( ExecutionPolicy&& policy,
                   ForwardIt first, ForwardIt last, UnaryPred p );
(5) (desde C++17)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if_not( ExecutionPolicy&& policy,
                       ForwardIt first, ForwardIt last, UnaryPred q );
(6) (desde C++17)

Devuelve un iterador al primer elemento en el rango fuente [first, last) que satisface criterios específicos (o last si no existe tal iterador).

1) find busca el primer elemento igual a value (usando operator==).
2) find_if busca el primer elemento para el cual el predicado p devuelve true.
3) find_if_not busca el primer elemento para el cual el predicado q devuelve false.
4-6) Igual que (1-3), pero ejecutado de acuerdo a policy.
Estas sobrecargas participan en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

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)

Parámetros

first, last - el par de iteradores que definen la fuente rango
value - valor con el que comparar los elementos
p - predicado unario que devuelve ​true para el elemento requerido.

La expresión p(v) debe ser convertible a bool para cada argumento v de tipo (posiblemente const) VT, donde VT es el tipo de valor de InputIt, independientemente de la categoría de valor, y no debe modificar v. Por lo tanto, un tipo de parámetro de VT&no está permitido, ni tampoco VT a menos que para VT un movimiento sea equivalente a una copia(desde C++11). ​

q - predicado unario que devuelve ​false para el elemento requerido.

La expresión q(v) debe ser convertible a bool para cada argumento v de tipo (posiblemente const) VT, donde VT es el tipo de valor de InputIt, independientemente de la categoría de valor, y no debe modificar v. Por lo tanto, un tipo de parámetro de VT&no está permitido, ni tampoco VT a menos que para VT un movimiento sea equivalente a una copia(desde C++11). ​

policy - la política de ejecución a utilizar
Requisitos de tipo
-
InputIt debe cumplir los requisitos de LegacyInputIterator.
-
ForwardIt debe cumplir los requisitos de LegacyForwardIterator.
-
UnaryPredicate debe cumplir los requisitos de Predicate.

Valor de retorno

El primer iterador it en el rango fuente que satisfaga la siguiente condición o last si no existe tal iterador:

1,4) *it == value es true.
2,5) p(*it) es true.
3,6) q(*it) es false.

Complejidad

Dado N como std::distance(first, last):

1) Como máximo N comparaciones con value usando operator==.
2) Como máximo N aplicaciones de p.
3) Como máximo N aplicaciones de q.
4) 𝓞(N) comparaciones con value usando operator==.
5) 𝓞(N) aplicaciones de p.
6) 𝓞(N) aplicaciones de q.

Excepciones

4-6) Durante el proceso de ejecución:
  • Si los recursos de memoria temporales requeridos para la paralelización no están disponibles, se lanza std::bad_alloc.
  • Si se lanza una excepción no capturada al acceder a objetos a través de un argumento del algoritmo, el comportamiento está determinado por la política de ejecución (para políticas estándar, se invoca std::terminate).

Posible implementación

find
template<class InputIt, class T = typename std::iterator_traits<InputIt>::value_type>
constexpr InputIt find(InputIt first, InputIt last, const T& value)
{
    for (; first != last; ++first)
        if (*first == value)
            return first;
    
    return last;
}
find_if
template<class InputIt, class UnaryPred>
constexpr InputIt find_if(InputIt first, InputIt last, UnaryPred p)
{
    for (; first != last; ++first)
        if (p(*first))
            return first;
    
    return last;
}
find_if_not
template<class InputIt, class UnaryPred>
constexpr InputIt find_if_not(InputIt first, InputIt last, UnaryPred q)
{
    for (; first != last; ++first)
        if (!q(*first))
            return first;
    
    return last;
}

Notas

Si C++11 no está disponible, un equivalente a std::find_if_not es usar std::find_if con el predicado negado.

template<class InputIt, class UnaryPred>
InputIt find_if_not(InputIt first, InputIt last, UnaryPred q)
{
    return std::find_if(first, last, std::not1(q));
}
prueba de características macro Valor Estándar Característica
__cpp_lib_algorithm_default_value_type 202403 (C++26) Inicialización de lista para algoritmos (1,4)

Ejemplo

El siguiente ejemplo encuentra números en secuencias dadas.

#include <algorithm>
#include <array>
#include <cassert>
#include <complex>
#include <initializer_list>
#include <iostream>
#include <vector>

bool is_even(int i)
{
    return i % 2 == 0;
}

void example_contains()
{
    const auto haystack = {1, 2, 3, 4};
    
    for (const int needle : {3, 5})
        if (std::find(haystack.begin(), haystack.end(), needle) == haystack.end())
            std::cout << "haystack does not contain " << needle << '\n';
        else
            std::cout << "haystack contains " << needle << '\n';
}

void example_predicate()
{
    for (const auto& haystack : {std::array{3, 1, 4}, {1, 3, 5}})
    {
        const auto it = std::find_if(haystack.begin(), haystack.end(), is_even);
        if (it != haystack.end())
            std::cout << "haystack contains an even number " << *it << '\n';
        else
            std::cout << "haystack does not contain even numbers\n";
    }
}

void example_list_init()
{
    std::vector<std::complex<double>> haystack{{4.0, 2.0}};
#ifdef __cpp_lib_algorithm_default_value_type
    // T gets deduced making list-initialization possible
    const auto it = std::find(haystack.begin(), haystack.end(), {4.0, 2.0});
#else
    const auto it = std::find(haystack.begin(), haystack.end(), std::complex{4.0, 2.0});
#endif
    assert(it == haystack.begin());  
}

int main()
{
    example_contains();
    example_predicate();
    example_list_init();
}

Salida:

haystack contains 3
haystack does not contain 5
haystack contains an even number 4
haystack does not contain even numbers

Informes de defectos

Los siguientes informes de defectos que cambian el comportamiento fueron aplicados retroactivamente a estándares C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 283 C++98 T se requería que fuera EqualityComparable, pero
el tipo de valor de InputIt podría no ser T
se eliminó el requisito

Véase también

encuentra el primer elemento que satisface criterios específicos
(objeto de función de algoritmo)
encuentra los primeros dos elementos adyacentes que son iguales (o satisfacen un predicado dado)
(plantilla de función & objeto de función de algoritmo)
encuentra la última secuencia de elementos en un cierto rango
(plantilla de función & objeto de función de algoritmo)
busca cualquiera de un conjunto de elementos
(plantilla de función & objeto de función de algoritmo)
encuentra la primera posición donde dos rangos difieren
(plantilla de función & objeto de función de algoritmo)
busca la primera ocurrencia de un rango de elementos
(plantilla de función & objeto de función de algoritmo)