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) |