std::find_first_of
| 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).
operator==.p.policy.true:
|
|
(hasta C++20) |
|
|
(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:
Aunque la firma no necesita tener |
| 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):
operator==.p.operator==.p.Excepciones
- 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
(C++20) |
busca cualquiera de un conjunto de elementos (objeto función de algoritmo) |
(C++11) |
encuentra el primer elemento que satisface criterios específicos (plantilla de función & objeto función de algoritmo) |
(C++20)(C++20)(C++20) |