Ce face std::find_if
std::find_if primește o funcție (de obicei lambda) care returnează bool și se oprește la primul element pentru care funcția dă true. std::find_if_not caută primul element pentru care condiția dă false.
Ca la std::find, dacă nu se găsește nimic, rezultatul este last.
Parametri
| Parametru | Descriere |
|---|---|
first, last |
Intervalul în care se caută. |
conditie |
Funcție bool(const T&) aplicată fiecărui element. |
Ce returnează
Iterator către primul element potrivit, sau last.
Exemple
Exemplul 1: Primul produs mai scump de 100 de lei
#include <algorithm>
#include <print>
#include <string>
#include <vector>
struct Produs {
std::string nume;
double pret;
};
int main() {
std::vector<Produs> raft{{"Caiet", 12.5}, {"Pix", 4.0}, {"Rucsac", 149.9}, {"Penar", 35.0}};
auto it = std::find_if(raft.begin(), raft.end(), [](const Produs& p) { return p.pret > 100; });
if (it != raft.end()) {
std::println("{} costă {:.2f} lei", it->nume, it->pret);
}
}
Rezultat
Rucsac costă 149.90 lei
Exemplul 2: Primul caracter care nu este spațiu
find_if_not sare peste spațiile de la început.
#include <algorithm>
#include <cctype>
#include <print>
#include <string>
int main() {
std::string text = " Salut, Ana!";
auto it = std::find_if_not(text.begin(), text.end(),
[](unsigned char c) { return std::isspace(c); });
std::println("Textul începe la poziția {}: '{}'", it - text.begin(), std::string(it, text.end()));
}
Rezultat
Textul începe la poziția 4: 'Salut, Ana!'
Greșeli frecvente
- Lambda primește elementul prin valoare când acesta este o structură mare. Folosește
const T&ca să eviți copii inutile.
Comenzi înrudite
std::find: Caută prima apariție a unei valori într-un interval și returnează un iterator către ea.std::count: Numără de câte ori apare o valoare (count) sau câte elemente îndeplinesc o condiție (count_if).std::all_of: Verifică dacă toate (all_of), măcar unul (any_of) sau niciunul (none_of) dintre elemente îndeplinesc o condiție.std::remove_if: Elimină logic elementele care îndeplinesc o condiție; folosit cu erase sau înlocuit de std::erase_if (C++20).