El algoritmo std::find_if C++
-
Utilice la función
std::find_if
para buscar elementos que satisfagan los criterios dados -
Utilice la función
std::find_first_of
para buscar coincidencias de elementos en dos rangos -
Utilice la función
find_end
para dividir la cadena con delimitadores
Este artículo demostrará cómo utilizar el algoritmo std::find_if
de la biblioteca de plantillas estándar de C++.
Utilice la función std::find_if
para buscar elementos que satisfagan los criterios dados
La función std::find_if
es parte de los algoritmos STL y proporciona un método de búsqueda de elementos en el rango que satisfacen la condición dada. Es decir, la condición se especifica como un objeto invocable que devuelve un valor bool
.
La sobrecarga básica de la función std::find_if
acepta dos iteradores que denotan el rango que necesita ser buscado. El tercer parámetro representa el objeto invocable utilizado para evaluar los elementos del rango. Tenga en cuenta que los iteradores de rango deben satisfacer al menos los requisitos de LegacyInputIterator
.
std::find_if
devuelve el iterador al primer elemento que satisface los criterios dados o al segundo iterador de argumento si no se encuentra dicho elemento.
En el siguiente fragmento de código, empleamos el algoritmo std::find_if
en objetos std::string
y usamos la función isupper
como objeto invocable. En consecuencia, la función debería ayudarnos a determinar si la cadena contiene solo letras minúsculas o no.
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "this is random String";
string str2 = "this is";
string str3 = "wqz";
std::find_if(begin(str1), end(str1), isupper) != end(str1)
? cout << "str1 contains uppercase letters" << endl
: cout << "str1 contains only lowercase letters" << endl;
std::find_if(begin(str2), end(str2), isupper) != end(str2)
? cout << "str2 contains uppercase letters" << endl
: cout << "str2 contains only lowercase letters" << endl;
return EXIT_SUCCESS;
}
Producción :
str1 contains uppercase letters
str2 contains only lowercase letters
Utilice la función std::find_first_of
para buscar coincidencias de elementos en dos rangos
std::find_first_of
es otro poderoso algoritmo de STL que se puede utilizar para buscar los mismos elementos en dos rangos dados. Las funciones aceptan cuatro iteradores como parámetros, los dos primeros de los cuales denotan el rango que debe buscarse para los elementos pasados como los dos últimos argumentos del iterador.
Los dos últimos iteradores deben cumplir los requisitos de LegacyForwardIterator
. En este caso, usamos el algoritmo std::find_first_of
para verificar si los caracteres coinciden en dos cadenas. El valor de retorno de la función es el iterador del primer elemento del rango buscado que coincide con un elemento del segundo rango. Si no se encuentra tal elemento, se devuelve el segundo iterador de los rangos buscados.
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "this is random String";
string str2 = "this is";
string str3 = "wqz";
std::find_first_of(str1.begin(), str1.end(), str2.begin(), str2.end()) ==
str1.end()
? cout << "no letters match in str1 and str2" << endl
: cout << "some letters match in str1 and str2" << endl;
std::find_first_of(str2.begin(), str2.end(), str3.begin(), str3.end()) ==
str2.end()
? cout << "no letters match in str2 and str3" << endl
: cout << "some letters match in str2 and str3" << endl;
return EXIT_SUCCESS;
}
Producción :
some letters match in str1 and str2
no letters match in str2 and str3
Utilice la función find_end
para dividir la cadena con delimitadores
Por otro lado, tenemos el algoritmo find_end
para buscar la última aparición de la secuencia de rango dada en otro rango. Al igual que std::find_first_of
, este algoritmo acepta cuatro iteradores que denotan ambos rangos, pero intenta encontrar la secuencia exacta que coincide en el primer rango.
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "this is random String";
string str2 = "this is";
string str3 = "wqz";
auto ret = std::find_end(str1.begin(), str1.end(), str2.begin(), str2.end());
ret == str1.end() ? cout << "no such sequence found" << endl
: cout << "last occurrence found at "
<< std::distance(str1.begin(), ret) << endl;
ret = std::find_end(str2.begin(), str2.end(), str3.begin(), str3.end());
ret == str2.end() ? cout << "no such sequence found" << endl
: cout << "last occurrence found at "
<< std::distance(str2.begin(), ret) << endl;
return EXIT_SUCCESS;
}
Producción :
last occurrence found at 0
no such sequence found
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook