O algoritmo std::find_if C++
-
Use a função
std::find_if
para pesquisar elementos que satisfaçam os critérios fornecidos -
Use a função
std::find_first_of
para pesquisar correspondências de elementos em dois intervalos -
Use a função
find_end
para dividir a string com delimitadores
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
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