std::search în C++

Caută prima apariție a unei secvențe de elemente în interiorul altui interval.

Sintaxă
ForwardIt1 search(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last);

Ce face std::search

std::search este echivalentul lui string::find pentru orice fel de date: găsește unde începe pentru prima dată subsecvența [s_first, s_last) în [first, last).

Dacă secvența nu apare, returnează last. Poate primi și un predicat de comparare, de exemplu pentru căutare fără să țină cont de majuscule.

Parametri

Parametru Descriere
first, last Intervalul în care se caută.
s_first, s_last Secvența căutată.

Ce returnează

Iterator către începutul primei potriviri, sau last.

Exemple

Exemplul 1: O secvență de numere

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

int main() {
    std::vector<int> semnal{0, 1, 1, 0, 1, 0, 0, 1};
    std::vector<int> model{1, 0, 0};

    auto it = std::search(semnal.begin(), semnal.end(), model.begin(), model.end());
    if (it != semnal.end()) {
        std::println("Modelul începe la poziția {}", it - semnal.begin());
    }
}

Rezultat

Modelul începe la poziția 4

Exemplul 2: Căutare fără majuscule

Al cincilea argument compară caracterele după transformarea în litere mici.

#include <algorithm>
#include <cctype>
#include <print>
#include <string>

int main() {
    std::string text = "Bine ai venit la DexBlog!";
    std::string cautat = "dexblog";

    auto it = std::search(text.begin(), text.end(), cautat.begin(), cautat.end(),
                          [](unsigned char a, unsigned char b) { return std::tolower(a) == std::tolower(b); });
    std::println("Găsit la poziția {}", it - text.begin());
}

Rezultat

Găsit la poziția 17

Greșeli frecvente

  • Folosești std::search pe std::string pentru o căutare simplă. Metoda text.find("...") este mai scurtă și returnează direct poziția.

Comenzi înrudite

  • std::find: Caută prima apariție a unei valori într-un interval și returnează un iterator către ea.
  • std::mismatch: Găsește prima poziție unde două intervale diferă și returnează iteratorii din ambele.
  • std::equal: Verifică dacă două intervale conțin aceleași elemente, în aceeași ordine.
  • std::adjacent_find: Găsește prima pereche de elemente vecine egale (sau care îndeplinesc o condiție între ele).