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.