std::find_end
| Definido en el archivo de encabezado <algorithm>
|
||
| (1) | ||
template< class ForwardIt1, class ForwardIt2 > ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last ); |
(hasta C++20) | |
template< class ForwardIt1, class ForwardIt2 > constexpr ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > ForwardIt1 find_end( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last ); |
(2) | (desde C++17) |
| (3) | ||
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate > ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPredicate p ); |
(hasta C++20) | |
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate > constexpr ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPredicate p ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate > ForwardIt1 find_end( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPredicate p ); |
(4) | (desde C++17) |
Busca la última ocurrencia de la secuencia [s_first, s_last) en el rango [first, last).
operator==.p.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.Parámetros
| first, last | - | El rango de los elementos a examinar. |
| s_first, s_last | - | El rango de los elementos a buscar. |
| policy | - | La política de ejecución a usar. Véase política de ejecución para más detalles. |
| p | - | Predicado binario que devuelve true si los elementos deben tratarse como iguales. La signatura de la función predicado deberá ser equivalente a la siguiente:
Mientras que la signatura no necesita tener |
| Requisitos de tipo | ||
-ForwardIt1 debe satisfacer los requisitos de ForwardIterator.
| ||
-ForwardIt2 debe satisfacer los requisitos de ForwardIterator.
| ||
Valor de retorno
Iterador al comienzo de la última ocurrencia de la secuencia [s_first, s_last) en el rango [first, last).
|
Si no se encuentra tal secuencia, se devuelve |
(hasta C++11) |
|
Si |
(desde C++11) |
Complejidad
Hace al menos S·(N-S+1) comparaciones, donde S es std::distance(first2, last2) y N es std::distance(first1, last1).
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.
Posible implementación
| Primera versión |
|---|
template<class ForwardIt1, class ForwardIt2>
ForwardIt1 find_end(ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last)
{
if (s_first == s_last)
return last;
ForwardIt1 result = last;
while (true) {
ForwardIt1 new_result = std::search(first, last, s_first, s_last);
if (new_result == last) {
break;
} else {
result = new_result;
first = result;
++first;
}
}
return result;
}
|
| Segunda versión |
template<class ForwardIt1, class ForwardIt2, class BinaryPredicate>
ForwardIt1 find_end(ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPredicate p)
{
if (s_first == s_last)
return last;
ForwardIt1 result = last;
while (true) {
ForwardIt1 new_result = std::search(first, last, s_first, s_last, p);
if (new_result == last) {
break;
} else {
result = new_result;
first = result;
++first;
}
}
return result;
}
|
Ejemplo
El siguiente código utiliza find_end() para buscar por dos secuencias de números distintas.
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
std::vector<int>::iterator result;
auto check = [&] {
result == v.end()
? std::cout << "No se encontró la secuencia.\n"
: std::cout << "La última ocurrencia se encuentra en: "
<< std::distance(v.begin(), result) << "\n";
};
std::vector<int> t1{1, 2, 3};
result = std::find_end(v.begin(), v.end(), t1.begin(), t1.end());
check();
std::vector<int> t2{4, 5, 6};
result = std::find_end(v.begin(), v.end(), t2.begin(), t2.end());
check();
}
Salida:
La última ocurrencia se encuentra en: 8
No se encontró la secuencia.
Véase también
| Busca una subsecuencia de elementos. (plantilla de función) | |
Devuelve true si una secuencia es una subsecuencia de otra. (plantilla de función) | |
| Encuentra dos elementos contiguos idénticos (o que satisfagan un predicado dado). (plantilla de función) | |
(C++11) |
Encuentra el primer elemento que satisfaga un criterio específico. (plantilla de función) |
| Busca por cualquiera de un conjunto de elementos. (plantilla de función) | |
| Busca un número de copias consecutivas de un elemento en un rango. (plantilla de función) | |
(C++20) |
Encuentra la última secuencia de elementos en un cierto rango. (niebloid) |