O algoritmo std::find_if C++

Jinku Hu 12 outubro 2023
  1. Use a função std::find_if para pesquisar elementos que satisfaçam os critérios fornecidos
  2. Use a função std::find_first_of para pesquisar correspondências de elementos em dois intervalos
  3. Use a função find_end para dividir a string com delimitadores
O algoritmo std::find_if C++

Este artigo demonstrará como utilizar o algoritmo std::find_if da C++ Standard Template Library.

Use a função std::find_if para pesquisar elementos que satisfaçam os critérios fornecidos

A função std::find_if é parte dos algoritmos STL e fornece um método de pesquisa para elementos no intervalo que satisfazem a condição dada. Ou seja, a condição é especificada como um objeto chamável que retorna um valor bool.

A sobrecarga básica da função std::find_if aceita dois iteradores denotando o intervalo que precisa ser pesquisado. O terceiro parâmetro representa o objeto chamável usado para avaliar os elementos no intervalo. Observe que os iteradores de intervalo devem pelo menos satisfazer os requisitos LegacyInputIterator.

std::find_if retorna o iterador para o primeiro elemento que satisfaça os critérios dados ou o segundo iterador de argumento se nenhum elemento for encontrado.

No seguinte trecho de código, empregamos o algoritmo std::find_if em objetos std::string e usamos a função isupper como o objeto que pode ser chamado. Conseqüentemente, a função deve nos ajudar a determinar se a string contém apenas letras minúsculas ou não.

#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;
}

Produção:

str1 contains uppercase letters
str2 contains only lowercase letters

Use a função std::find_first_of para pesquisar correspondências de elementos em dois intervalos

std::find_first_of é outro algoritmo poderoso de STL que pode ser utilizado para pesquisar os mesmos elementos em dois intervalos dados. As funções aceitam quatro iteradores como parâmetros, os dois primeiros denotam o intervalo que precisa ser pesquisado para os elementos passados ​​como os dois últimos argumentos do iterador.

Os últimos dois iteradores devem atender aos requisitos de LegacyForwardIterator. Neste caso, usamos o algoritmo std::find_first_of para verificar se os caracteres combinam em duas strings. O valor de retorno da função é o iterador para o primeiro elemento no intervalo pesquisado que corresponde a um elemento do segundo intervalo. Se nenhum elemento for encontrado, o segundo iterador dos intervalos pesquisados ​​é retornado.

#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;
}

Produção:

some letters match in str1 and str2
no letters match in str2 and str3

Use a função find_end para dividir a string com delimitadores

Por outro lado, temos o algoritmo find_end para pesquisar a última ocorrência da sequência de intervalo dada em outro intervalo. Como o std::find_first_of, este algoritmo aceita quatro iteradores denotando ambos os intervalos, mas tenta encontrar a correspondência de sequência exata no primeiro intervalo.

#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;
}

Produção:

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

Artigo relacionado - C++ Algorithm