std::find_if în C++

Găsește primul element care îndeplinește o condiție (find_if) sau primul care nu o îndeplinește (find_if_not).

Sintaxă
InputIt find_if(InputIt first, InputIt last, UnaryPred conditie);
InputIt find_if_not(InputIt first, InputIt last, UnaryPred conditie);  // C++11

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).