L'algorithme std::find_if C++
-
Utilisez la fonction
std::find_if
pour rechercher des éléments satisfaisant aux critères donnés -
Utilisez la fonction
std::find_first_of
pour rechercher des correspondances d’éléments dans deux plages -
Utilisez la fonction
find_end
pour diviser la chaîne avec des délimiteurs
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
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