21.07
2020
Mais um post sobre STL Algorithms, semana passada foram dois posts referentes a assuntos complementares, hoje o post é sobre fazer pesquisa utilizando std::find e std::search.
std::find
Começando com um exemplo para localizar uma entrada dentro de um array simples:
#include <algorithm>
#include <iostream>
int main() {
int v[] = {60, 20, 5, 50, 15, 30, 10};
int vsize = sizeof(v)/sizeof(int);
int *fifteen = std::find(v, v + vsize, 15);
int pos = (int)(fifteen - v);
if (pos != vsize)
std::cout << "Encontrado 15 na " << pos + 1 << "a. posicao: " <<
*fifteen << std::endl;
else
std::cout << "Nao foi encontrado 15" << std::endl;
}
A sintaxe é bem simples. Os dois primeiros parâmetros são o início e o final do container, ou no nosso caso do array. E o terceiro parâmetro é o objeto da pesquisa.
Note que quando utilizamos arrays com STL Algorithms é necessário indicar como final da pesquisa uma posição fora do array, por isso passamos v + vsize. Outra opção seria passar &v[size].
std::search
Para o exemplo do std::search uma pesquisa case insensitive em uma std::string.
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
bool cmpchar(char c1, char c2) {
return (::toupper(c1) == ::toupper(c2));
}
int main() {
std::string source = "abcdefghijklmnopqrstuvwxyz";
std::string frag = "KLM";
std::string::iterator it = std::search(
source.begin(), source.end(),
frag.begin(), frag.end(),
cmpchar
);
if (it != source.end())
std::cout << "Encontrado fragmento " << frag <<
" na string " << source << std::endl;
else
std::cout << "Nao encontrado fragmento " << frag <<
" na string " << source << std::endl;
}
A sintaxe é muito parecida com a do find, os dois primeiros parâmetros são início e final do container aonde a pesquisa será feita, os terceiro e quartos parâmetros são o início e final do trecho que estamos procurando, e o último parâmetro, opcional, uma função de comparação que retorna um tipo bool.
Existem ainda um conjunto de funções de pesquisa dentre os STL Algorithms, tais como: std::find_if, std::find_if_not, std::find_end, std::find_first_of e std::search_n. São todos variações dos algoritmos std::find e std::search, mas saber os dois básicos já é um bom começo.