MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Căutarea elementelor

Funcția std::find() caută o valoare specificată într-un anumit interval de elemente. Pentru compararea valorilor, se utilizează operatorul de comparație ==. Să examinăm una dintre versiunile funcției:

std::find(start_iterator, end_iterator, value)

Pentru a stabili intervalul în funcție, sunt transmise iteratorii pentru începutul și sfârșitul intervalului și valoarea pe care trebuie să o căutăm. Rezultatul funcției este un iterator care indică valoarea găsită. Dacă valoarea nu este găsită, iteratorul returnat va indica sfârșitul intervalului. Să încercăm să căutăm anumite numere într-un vector de numere:

#include <iostream>
#include <vector>
#include <algorithm>
  
void findValue(const std::vector<int>& data, int value)
{
    auto result = std::find(begin(data), end(data), value);
    if (result == end(data))
        std::cout << "Value not found" << std::endl;
    else
        std::cout << "Value found at position " << (result - begin(data)) << std::endl;
}

int main()
{
    std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8};
    findValue(numbers, 4);    // Value found at position 3 
    findValue(numbers, 12);   // Value not found
}

În acest exemplu, căutarea este realizată într-o funcție separată - findValue. În aceasta, căutăm într-un vector de numere o anumită valoare. Ca început și sfârșit al intervalului pentru căutare, în funcția std::find() sunt transmiși iteratorii pentru începutul și sfârșitul vectorului:

auto result = std::find(begin(data), end(data), value);

Dacă valoarea nu este găsită, iteratorul obținut va fi egal cu iteratorul de sfârșit al vectorului:

if (result == end(data))

Dacă valoarea este găsită, scăzând iteratorul de început al vectorului din iteratorul obținut, putem obține indicele valorii în vector:

std::cout << "Value found at position " << (result - begin(data)) << std::endl;

Căutarea pe baza unui criteriu

O serie de funcții suplimentare returnează un iterator care indică valoarea dintr-un interval care satisface un anumit criteriu. Funcția std::find_if() returnează un iterator care indică primul element din interval care satisface condiția respectivă. În schimb, funcția std::find_if_not() returnează un iterator care indică primul element din interval care NU satisface condiția respectivă. Să vedem un exemplu cu funcția std::find_if():

#include <iostream>
#include <vector>
#include <algorithm>

// dacă numărul este par
bool is_even(int n) { return n % 2 == 0; }
// dacă numărul este pozitiv
bool is_positive(int n) { return n > 0; }
// dacă numărul este mai mare decât 10
bool is_greater10(int n) { return n > 10; }

template <typename T>
void findValue(const std::vector<T>& data, bool(*condition)(T))
{
    auto result = std::find_if(begin(data), end(data), condition);
    if (result == end(data))
        std::cout << "Value not found" << std::endl;
    else
        std::cout << "Value found at position " << (result - begin(data)) << std::endl;
}

int main()
{
    std::vector<int> numbers { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
    findValue(numbers, is_even);        // Value found at position 1
    findValue(numbers, is_positive);    // Value found at position 6
    findValue(numbers, is_greater10);   // Value not found
}

Funcția std::find_if() primește iteratorii pentru începutul și sfârșitul intervalului de căutare, iar al treilea parametru reprezintă condiția care trebuie îndeplinită de elementele din interval:

std::find_if(begin(data), end(data), condition)

Condiția reprezintă o funcție care primește o valoare de tip arbitrar și returnează un rezultat de tip bool - true dacă valoarea îndeplinește condiția și false dacă nu o îndeplinește. Practic, condiția poate fi descrisă printr-un pointer la funcție de tipul bool(*condition)(T), unde T este un tip arbitrar.

Pentru test, sunt definite trei funcții care stabilesc condițiile: is_even() (verifică dacă numărul este par), is_positive() (verifică dacă numărul este pozitiv) și is_greater10() (verifică dacă numărul este mai mare decât 10).

Funcția std::find_if() returnează iteratorul pentru prima valoare găsită care îndeplinește condiția. Dacă nu sunt găsite astfel de valori, iteratorul va indica sfârșitul intervalului.

Principiul de funcționare al funcției std::find_if_not() va fi similar.