El algoritmo std::find_if C++

Jinku Hu 12 octubre 2023
  1. Utilice la función std::find_if para buscar elementos que satisfagan los criterios dados
  2. Utilice la función std::find_first_of para buscar coincidencias de elementos en dos rangos
  3. Utilice la función find_end para dividir la cadena con delimitadores
El algoritmo std::find_if C++

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ Algorithm