L'algorithme std::find_if C++

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction std::find_if pour rechercher des éléments satisfaisant aux critères donnés
  2. Utilisez la fonction std::find_first_of pour rechercher des correspondances d’éléments dans deux plages
  3. Utilisez la fonction find_end pour diviser la chaîne avec des délimiteurs
L'algorithme std::find_if C++

Cet article montrera comment utiliser l’algorithme std::find_if de la bibliothèque de modèles standard C++.

Utilisez la fonction std::find_if pour rechercher des éléments satisfaisant aux critères donnés

La fonction std::find_if fait partie des algorithmes STL et fournit une méthode de recherche d’éléments dans la plage satisfaisant la condition donnée. A savoir, la condition est spécifiée comme un objet appelable qui renvoie une valeur bool.

La surcharge de base de la fonction std::find_if accepte deux itérateurs indiquant la plage à rechercher. Le troisième paramètre représente l’objet appelable utilisé pour évaluer les éléments de la plage. Notez que les itérateurs de plage doivent au moins satisfaire aux exigences LegacyInputIterator.

std::find_if renvoie l’itérateur au premier élément satisfaisant aux critères donnés ou au deuxième argument de l’itérateur si aucun élément de ce type n’est trouvé.

Dans l’extrait de code suivant, nous employons l’algorithme std::find_if sur les objets std::string et utilisons la fonction isupper comme objet appelable. Par conséquent, la fonction devrait nous aider à déterminer si la chaîne ne contient que des lettres minuscules ou non.

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

Production:

str1 contains uppercase letters
str2 contains only lowercase letters

Utilisez la fonction std::find_first_of pour rechercher des correspondances d’éléments dans deux plages

std::find_first_of est un autre algorithme puissant de STL qui peut être utilisé pour rechercher les mêmes éléments dans deux plages données. Les fonctions acceptent quatre itérateurs comme paramètres, dont les deux premiers indiquent la plage à rechercher pour les éléments passés comme les deux derniers arguments de l’itérateur.

Ces deux derniers itérateurs doivent répondre aux exigences de LegacyForwardIterator. Dans ce cas, nous utilisons l’algorithme std::find_first_of pour vérifier si les caractères correspondent dans deux chaînes. La valeur de retour de la fonction est l’itérateur du premier élément de la plage recherchée qui correspond à un élément de la deuxième plage. Si aucun élément de ce type n’est trouvé, le deuxième itérateur des plages recherchées est renvoyé.

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

Production:

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

Utilisez la fonction find_end pour diviser la chaîne avec des délimiteurs

D’autre part, nous avons l’algorithme find_end pour rechercher la dernière occurrence de la séquence de plage donnée dans une autre plage. Comme le std::find_first_of, cet algorithme accepte quatre itérateurs dénotant les deux plages, mais il essaie de trouver la correspondance exacte de séquence dans la première plage.

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

Production:

last occurrence found at 0
no such sequence found
Auteur: 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

Article connexe - C++ Algorithm