std::equal_range în C++

Într-un interval sortat, returnează perechea de iteratori care delimitează toate elementele egale cu valoarea.

Sintaxă
std::pair<ForwardIt, ForwardIt> equal_range(ForwardIt first, ForwardIt last, const T& valoare);

Ce face std::equal_range

std::equal_range face într-un singur apel ce fac lower_bound și upper_bound: returnează o pereche {prim, ultim}. Elementele egale cu valoarea sunt exact cele din [prim, ultim).

Dacă valoarea nu există, cei doi iteratori sunt egali și arată locul unde ar trebui inserată.

Parametri

Parametru Descriere
first, last Interval sortat.
valoare Valoarea căutată.

Ce returnează

std::pair de iteratori.

Exemple

Exemplul 1: Toate notele de 8

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

int main() {
    std::vector<int> note{5, 6, 8, 8, 8, 9, 10};

    auto [prim, ultim] = std::equal_range(note.begin(), note.end(), 8);
    std::println("Nota 8 apare de {} ori, de la poziția {}", ultim - prim, prim - note.begin());

    auto [a, b] = std::equal_range(note.begin(), note.end(), 7);
    std::println("Nota 7: {} apariții, s-ar insera la poziția {}", b - a, a - note.begin());
}

Rezultat

Nota 8 apare de 3 ori, de la poziția 2
Nota 7: 0 apariții, s-ar insera la poziția 2

Exemplul 2: Cuvinte după lungime

Vectorul este sortat după lungime, iar comparatorul compară lungimi. std::ranges::equal_range folosește proiecția size.

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

int main() {
    std::vector<std::string> cuvinte{"ac", "pom", "nor", "lac", "carte", "fereastră"};

    auto gasite = std::ranges::equal_range(cuvinte, 3, {}, &std::string::size);
    for (const auto& c : gasite) {
        std::print("{} ", c);
    }
    std::println("");
}

Rezultat

pom nor lac

Greșeli frecvente

  • Folosești equal_range pe un std::multimap cu funcția din <algorithm>. Containerul are propria metodă equal_range, mult mai rapidă.

Comenzi înrudite

  • std::lower_bound: Într-un interval sortat, găsește primul element ≥ valoare (lower_bound) sau primul element > valoare (upper_bound).
  • std::binary_search: Verifică foarte rapid dacă o valoare există într-un interval deja sortat.
  • std::count: Numără de câte ori apare o valoare (count) sau câte elemente îndeplinesc o condiție (count_if).