std::find în C++

Caută prima apariție a unei valori într-un interval și returnează un iterator către ea.

Sintaxă
InputIt find(InputIt first, InputIt last, const T& valoare);

Ce face std::find

std::find compară pe rând fiecare element cu valoarea căutată (cu ==) și se oprește la prima potrivire. Dacă nu găsește nimic, returnează last, de obicei v.end().

Funcționează pe orice container și nu are nevoie ca datele să fie sortate, dar parcurge elementele unul câte unul (O(n)). Poziția se obține cu it - v.begin() sau std::distance.

Pentru căutare după o condiție folosește std::find_if. Varianta C++20 este std::ranges::find(v, valoare).

Parametri

Parametru Descriere
first, last Intervalul în care se caută.
valoare Valoarea căutată.

Ce returnează

Iterator către primul element egal cu valoarea, sau last dacă nu există.

Exemple

Exemplul 1: Găsit sau nu

Rezultatul trebuie comparat întotdeauna cu end() înainte de a-l folosi.

#include <algorithm>
#include <print>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> orase{"București", "Cluj", "Iași", "Timișoara"};

    auto it = std::find(orase.begin(), orase.end(), "Iași");
    if (it != orase.end()) {
        std::println("Iași este pe poziția {}", it - orase.begin());
    }

    if (std::find(orase.begin(), orase.end(), "Galați") == orase.end()) {
        std::println("Galați nu este în listă");
    }
}

Rezultat

Iași este pe poziția 2
Galați nu este în listă

Exemplul 2: Toate aparițiile unei valori

După fiecare potrivire, căutarea continuă de la elementul următor.

#include <algorithm>
#include <print>
#include <vector>

int main() {
    std::vector<int> zaruri{3, 6, 1, 6, 2, 6};

    for (auto it = std::find(zaruri.begin(), zaruri.end(), 6); it != zaruri.end();
         it = std::find(it + 1, zaruri.end(), 6)) {
        std::println("6 la aruncarea {}", it - zaruri.begin() + 1);
    }
}

Rezultat

6 la aruncarea 2
6 la aruncarea 4
6 la aruncarea 6

Greșeli frecvente

  • Folosești *it fără să verifici it != v.end(). Dacă valoarea lipsește, dereferențierea lui end() este comportament nedefinit.
  • Cauți cu std::find într-un std::set sau std::map. Merge, dar este liniar; metoda find a containerului este logaritmică.

Comenzi înrudite

  • std::find_if: Găsește primul element care îndeplinește o condiție (find_if) sau primul care nu o îndeplinește (find_if_not).
  • std::ranges::find: Caută o valoare direct într-un container, opțional după un câmp al elementelor (proiecție).
  • std::count: Numără de câte ori apare o valoare (count) sau câte elemente îndeplinesc o condiție (count_if).
  • std::binary_search: Verifică foarte rapid dacă o valoare există într-un interval deja sortat.
  • std::search: Caută prima apariție a unei secvențe de elemente în interiorul altui interval.