Może pomóc rozważyć zachowanie się lower_bound
i upper_bound
łącznie.
W STL zakresy są zawsze przerwami otwartymi. Zakres ograniczony przez dwa iteratory, first
i last
, obejmuje wszystkie elementy między first
i last
, w tym first
i wyłączając last
. Używając notacji przedziałowej, będziemy to reprezentować jako [first, last)
.
są zdefiniowane w taki sposób, że znajdują zakres od elementów, które są równe podanej wartości. Jeśli wykonasz iterację między lower_bound(x)
a upper_bound(x)
, powtórzysz wszystkie elementy porównywane z wartościami x
. Jeśli żaden element nie jest równy x
, wówczas jest zagwarantowane, że lower_bound(x) == upper_bound(x)
.
Ta funkcja jest mniej ważna dla std::map
, która ma co najwyżej jeden element dla każdego klucza, ale jest bardzo przydatną funkcją dla nieunikalnych pojemników asocjacyjnych i dla niezgłoszenia std::lower_bound
, które mogą być używane z dowolnymi sekwencjami posortowanych elementów.
[Zauważ, że jeśli chcą uzyskać zarówno dolną i górną granicę, należy zadzwonić equal_range
zamiast, który powraca zarówno.]
prawdopodobnie jest to bardziej powszechne, aby myśleć w kategoriach zakresów iteratorów, więc powrót iteratora jest niższą "barierą", gdy mówisz "Chcę wszystko od 2 do 5". Pytanie brzmi jednak: dlaczego mielibyście oczekiwać, że będzie inaczej? Co kryje się za/twoim/rozumowaniem? – PlasmaHH
Oprócz doskonałej odpowiedzi, możesz po prostu uzyskać infimum używając 'std :: prev (iter)' if '* iter! = X'. –
Korekty - "... standardowa biblioteka określa ją jako ** najmniejszą ** liczbę nie mniejszą niż ..." @ Sugestia KonradRudolph jest dobra, ale najpierw musisz również sprawdzić, czy 'set' nie jest pusty.Dla funkcji 'std :: lower_bound' możesz także użyć' reverse_iterator's i 'std :: greater', aby odwrócić kierunek" błędu ". – Potatoswatter