std::find_end
Definido en el archivo de encabezado <algorithm>
|
||
(1) | ||
template< class ForwardIt1, class ForwardIt2 > ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, |
(hasta C++20) | |
template< class ForwardIt1, class ForwardIt2 > constexpr ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > ForwardIt1 find_end( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, |
(2) | (desde C++17) |
(3) | ||
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate > ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, |
(hasta C++20) | |
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate > constexpr ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate > ForwardIt1 find_end( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, |
(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.Contenido |
[editar] 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: bool pred(const Tipo1 &a, const Tipo2 &b); Mientras que la signatura no necesita tener const &, la función no debe modificar los objetos que se le han pasado y debe ser capaz de aceptar todos los valores de tipo (posiblemente const) |
Requisitos de tipo | ||
-ForwardIt1 debe satisfacer los requisitos de ForwardIterator.
| ||
-ForwardIt2 debe satisfacer los requisitos de ForwardIterator.
|
[editar] 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) |
[editar] Complejidad
Hace al menos S·(N-S+1) comparaciones, donde S es std::distance(first2, last2) y N es std::distance(first1, last1).
[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 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; } |
[editar] 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.
[editar] 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) |