std::mismatch
| Definido en el archivo de encabezado <algorithm>
|
||
| (1) | ||
template< class InputIt1, class InputIt2 > std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2 ); |
(hasta C++20) | |
template< class InputIt1, class InputIt2 > constexpr std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2 ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > std::pair<ForwardIt1,ForwardIt2> mismatch( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 ); |
(2) | (desde C++17) |
| (3) | ||
template< class InputIt1, class InputIt2, class BinaryPredicate > std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p ); |
(hasta C++20) | |
template< class InputIt1, class InputIt2, class BinaryPredicate > constexpr std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate > std::pair<ForwardIt1,ForwardIt2> mismatch( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, BinaryPredicate p ); |
(4) | (desde C++17) |
| (5) | ||
template< class InputIt1, class InputIt2 > std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2 ); |
(desde C++14) (hasta C++20) |
|
template< class InputIt1, class InputIt2 > constexpr std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2 ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > std::pair<ForwardIt1,ForwardIt2> mismatch( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, ForwardIt2 last2 ); |
(6) | (desde C++17) |
| (7) | ||
template< class InputIt1, class InputIt2, class BinaryPredicate > std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPredicate p ); |
(desde C++14) (hasta C++20) |
|
template< class InputIt1, class InputIt2, class BinaryPredicate > constexpr std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPredicate p ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate > std::pair<ForwardIt1,ForwardIt2> mismatch( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, ForwardIt2 last2, BinaryPredicate p ); |
(8) | (desde C++17) |
Devuelve el primer par de elementos que no coinciden de dos rangos: uno definido por [first1, last1) y otro definido por [first2,last2). Si no se proporciona last2 (las sobrecargas (1-4)), denota first2 + (last1 - first1).
operator==.p dado.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
| first1, last1 | - | El primer rango de los elementos. |
| first2, last2 | - | El primer rango de los elementos. |
| 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 | ||
-InputIt1 debe satisfacer los requisitos de InputIterator.
| ||
-InputIt2 debe satisfacer los requisitos de InputIterator.
| ||
-ForwardIt1 debe satisfacer los requisitos de ForwardIterator.
| ||
-ForwardIt2 debe satisfacer los requisitos de ForwardIterator.
| ||
-BinaryPredicate debe satisfacer los requisitos de BinaryPredicate.
| ||
Valor de retorno
std::pair con iteradores a los primeros dos elementos que no coinciden.
|
Si no se encuentran discrepancias cuando la comparación llega a |
(hasta C++14) |
|
Si no se encuentran discrepancias cuando la comparación llega a |
(desde C++14) |
Complejidad
last1 - first1 aplicaciones de operator== o el predicado p.last1 - first1, last2 - first2) aplicaciones de operator== o el predicado p.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 InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2)
{
while (first1 != last1 && *first1 == *first2) {
++first1, ++first2;
}
return std::make_pair(first1, first2);
}
|
| Segunda versión |
template<class InputIt1, class InputIt2, class BinaryPredicate>
std::pair<InputIt1, InputIt2>
mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p)
{
while (first1 != last1 && p(*first1, *first2)) {
++first1, ++first2;
}
return std::make_pair(first1, first2);
}
|
| Tercera versión |
template<class InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
{
while (first1 != last1 && first2 != last2 && *first1 == *first2) {
++first1, ++first2;
}
return std::make_pair(first1, first2);
}
|
| Cuarta versión |
template<class InputIt1, class InputIt2, class BinaryPredicate>
std::pair<InputIt1, InputIt2>
mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPredicate p)
{
while (first1 != last1 && first2 != last2 && p(*first1, *first2)) {
++first1, ++first2;
}
return std::make_pair(first1, first2);
}
|
Ejemplo
Este programa determina la subcadena más larga que se encuentra simultáneamente al principio de la cadena dada y al final de la misma, en orden inverso (posiblemente superpuesta).
#include <iostream>
#include <string>
#include <algorithm>
// Dado un texto de entrada, devuelve subcadena más larga
// donde la cadena deja de reflejarse
std::string reflejo_termina(const std::string& texto)
{
return std::string(texto.begin(),
std::mismatch(texto.begin(), texto.end(), texto.rbegin()).first);
}
int main()
{
std::cout << reflejo_termina("abXYZba") << '\n'
<< reflejo_termina("abca") << '\n'
<< reflejo_termina("anitalavalatina") << '\n';
}
Salida:
ab
a
anitalavalatina
Véase también
| Determina si dos conjuntos de elementos son iguales. (plantilla de función) | |
(C++11) |
Encuentra el primer elemento que satisfaga un criterio específico. (plantilla de función) |
Devuelve true si un rango es lexicográficamente menor que otro. (plantilla de función) | |
| Busca una subsecuencia de elementos. (plantilla de función) | |
(C++20) |
Encuentra la primera posición donde dos rangos difieren. (niebloid) |