std::map::lower_bound în C++

lower_bound() găsește prima cheie mai mare sau egală cu valoarea dată, upper_bound() prima cheie strict mai mare.

Sintaxă
iterator lower_bound(const Cheie& cheie);
iterator upper_bound(const Cheie& cheie);

Ce face std::map::lower_bound

Pentru că un map este sortat, poți căuta nu doar o cheie exactă, ci și „locul” unei chei. lower_bound(k) returnează iteratorul primului element cu cheia >= k, iar upper_bound(k) pe al primului cu cheia > k. Dacă nu există un astfel de element, returnează end().

Împreună dau intervale: elementele cu cheile între a și b (inclusiv) sunt în [lower_bound(a), upper_bound(b)). Funcționează la fel pentru std::set, std::multimap și std::multiset.

Parametri

Parametru Descriere
cheie Valoarea de comparat cu cheile.

Ce returnează

Un iterator (sau end()).

Exemple

Exemplul 1: Comenzile dintr-un interval de date

Datele scrise ca text AAAA-LL-ZZ se sortează corect alfabetic.

#include <map>
#include <print>
#include <string>

int main() {
    std::map<std::string, int> comenzi{
        {"2025-03-02", 120}, {"2025-03-05", 80}, {"2025-03-09", 300},
        {"2025-03-15", 45}, {"2025-03-21", 210},
    };
    auto prim = comenzi.lower_bound("2025-03-05");
    auto ultim = comenzi.upper_bound("2025-03-15");
    int total = 0;
    for (auto it = prim; it != ultim; ++it) {
        std::println("{}: {} lei", it->first, it->second);
        total += it->second;
    }
    std::println("Total 5-15 martie: {} lei", total);
}

Rezultat

2025-03-05: 80 lei
2025-03-09: 300 lei
2025-03-15: 45 lei
Total 5-15 martie: 425 lei

Exemplul 2: Tranșe de impozitare: prima limită potrivită

#include <map>
#include <print>
#include <string>

int main() {
    // limita superioară a venitului -> categoria
    std::map<int, std::string> transe{{3000, "mic"}, {8000, "mediu"}, {20000, "mare"}};
    for (int venit : {2500, 3000, 7999, 15000, 50000}) {
        auto it = transe.lower_bound(venit);
        std::println("{:>6}: {}", venit, it != transe.end() ? it->second : "foarte mare");
    }
}

Rezultat

  2500: mic
  3000: mic
  7999: mediu
 15000: mare
 50000: foarte mare

Greșeli frecvente

  • Dereferențiezi rezultatul fără să verifici end(): dacă toate cheile sunt mai mici, lower_bound returnează end().
  • Folosești std::lower_bound din <algorithm> pe un map. Merge, dar e lent (iteratorii unui map nu sar direct la mijloc); funcția membră folosește arborele și este O(log n).

Comenzi înrudite

  • std::map::find: find() caută o cheie și returnează un iterator la ea sau end(); count() și contains() spun doar dacă există.
  • std::map: Dicționar ordonat: asociază fiecărei chei unice o valoare și păstrează cheile sortate.
  • std::set: Mulțime ordonată de valori unice: elimină automat duplicatele și păstrează elementele sortate.
  • std::lower_bound: Într-un interval sortat, găsește primul element ≥ valoare (lower_bound) sau primul element > valoare (upper_bound).