Namespaces
Variants

std::find_first_of

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.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)

Ordenamiento y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de mezcla (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 ForwardIt >
InputIt find_first_of( InputIt first1, InputIt last1,
                       ForwardIt first2, ForwardIt last2 );
(1) (constexpr desde C++20)
template< class InputIt, class ForwardIt, class BinaryPred >
InputIt find_first_of( InputIt first1, InputIt last1,
                       ForwardIt first2, ForwardIt last2,
                       BinaryPred p );
(2) (constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt1 find_first_of( ExecutionPolicy&& policy,
                          ForwardIt1 first1, ForwardIt1 last1,
                          ForwardIt2 first2, ForwardIt2 last2 );
(3) (desde C++17)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 find_first_of( ExecutionPolicy&& policy,
                          ForwardIt1 first1, ForwardIt last1,
                          ForwardIt2 first2, ForwardIt2 last2,
                          BinaryPred p );
(4) (desde C++17)

Busca en el rango fuente [first1, last1) cualquiera de los elementos en el rango destino [first2, last2).

1) Los elementos se comparan usando operator==.
2) Los elementos se comparan usando el predicado binario dado p.
3,4) Igual que (1,2), pero ejecutado según 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

first1, last1 - el par de iteradores que definen el origen rango
first2, last2 - el par de iteradores que definen el destino rango
p - predicado binario que devuelve ​true si los elementos deben ser tratados como iguales.

La firma de la función predicado debe ser equivalente a la siguiente:

bool pred(const Type1 &a, const Type2 &b);

Aunque la firma no necesita tener const &, la función no debe modificar los objetos que se le pasan y debe poder aceptar todos los valores de tipo (posiblemente const) Type1 y Type2 independientemente de la categoría de valor (por lo tanto, Type1 & no está permitido, ni tampoco Type1 a menos que para Type1 un movimiento sea equivalente a una copia(desde C++11)).
Los tipos Type1 y Type2 deben ser tales que los objetos de tipos ForwardIt1 y ForwardIt2 puedan ser desreferenciados y luego convertidos implícitamente a Type1 y Type2 respectivamente. ​

policy - la política de ejecución a usar
Requisitos de tipo
-
InputIt debe cumplir los requisitos de LegacyInputIterator.
-
ForwardIt debe cumplir los requisitos de LegacyForwardIterator.
-
ForwardIt1 debe cumplir los requisitos de LegacyForwardIterator.
-
ForwardIt2 debe cumplir los requisitos de LegacyForwardIterator.
-
BinaryPred debe cumplir los requisitos de BinaryPredicate.

Valor devuelto

Iterador al primer elemento en el rango fuente que coincide con un elemento del rango destino.

Si el rango destino está vacío o no se encuentra tal elemento, se devuelve last1.

Complejidad

Dado N1 como std::distance(first1, last1) y N2 como std::distance(first2, last2):

1) Como máximo N1⋅N2 comparaciones usando operator==.
2) Como máximo N1⋅N2 aplicaciones de p.
3) 𝓞(N1⋅N2) comparaciones usando operator==.
4) 𝓞(N1⋅N2) aplicaciones de p.

Excepciones

3,4) 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 mientras se accede a objetos mediante un argumento de 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_first_of (1)
template<class InputIt, class ForwardIt>
InputIt find_first_of(InputIt first1, InputIt last1,
                      ForwardIt first2, ForwardIt last2)
{
    for (; first1 != last1; ++first1)
        for (ForwardIt it = first2; it != last2; ++it)
            if (*first1 == *it)
                return first1;
    return last1;
}
find_first_of (2)
template<class InputIt, class ForwardIt, class BinaryPred>
InputIt find_first_of(InputIt first1, InputIt last1,
                      ForwardIt first2, ForwardIt last2,
                      BinaryPred p)
{
    for (; first1 != last1; ++first1)
        for (ForwardIt it = first2; it != last2; ++it)
            if (p(*first1, *it))
                return first1;
    return last1;
}

Ejemplo

El siguiente código busca cualquiera de los enteros especificados en un vector de enteros:

#include <algorithm>
#include <iostream>
#include <vector>

auto print_sequence = [](const auto id, const auto& seq, int pos = -1)
{
    std::cout << id << "{ ";
    for (int i{}; const auto& e : seq)
    {
        const bool mark{i == pos};
        std::cout << (i++ ? ", " : "");
        std::cout << (mark ? "[ " : "") << e << (mark ? " ]" : "");
    }
    std::cout << " }\n";
};

int main()
{
    const std::vector<int> v{0, 2, 3, 25, 5};
    const auto t1 = {19, 10, 3, 4};
    const auto t2 = {1, 6, 7, 9};
    
    auto find_any_of = [](const auto& v, const auto& t)
    {
        const auto result = std::find_first_of(v.begin(), v.end(),
                                               t.begin(), t.end());
        if (result == v.end())
        {
            std::cout << "No elements of v are equal to any element of ";
            print_sequence("t = ", t);
            print_sequence("v = ", v);
        }
        else
        {
            const auto pos = std::distance(v.begin(), result);
            std::cout << "Found a match (" << *result << ") at position " << pos;
            print_sequence(", where t = ", t);
            print_sequence("v = ", v, pos);
        }
    };
    
    find_any_of(v, t1);
    find_any_of(v, t2);
}

Salida:

Found a match (3) at position 2, where t = { 19, 10, 3, 4 }
v = { 0, 2, [ 3 ], 25, 5 }
No elements of v are equal to any element of t = { 1, 6, 7, 9 }
v = { 0, 2, 3, 25, 5 }

Informes de defectos

Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a los estándares C++ publicados anteriormente.

DR Aplicado a Comportamiento como se publicó Comportamiento correcto
LWG 576 C++98 first1 y last1 necesitaban ser LegacyForwardIterators solo necesitan ser LegacyInputIterators
LWG 1205 C++98 el valor de retorno no estaba claro si el rango destino está vacío devuelve last1 en este caso

Véase también

busca cualquiera de un conjunto de elementos
(objeto función de algoritmo)
encuentra el primer elemento que satisface criterios específicos
(plantilla de función & objeto función de algoritmo)