STL Algorithms: Algoritmos de Pesquisa

por Fabio A. Mazzarino

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.