Я прочитал описание функций C ++ upper_bound () и lower_bound (). Мне интересно, что upper_bound () возвращает только первый итератор со значением> val (или возвращает последний итератор в диапазоне [first, last), если val не найдено).

Реализация отличается от lower_bound (), в то время как он возвращает первый итератор НЕ МЕНЬШЕ, чем val, поэтому он позволяет возвращать указатель, эквивалентный val.

Мне просто любопытно узнать, какова цель разработки upper_bound () таким образом, чтобы upper_bound () НЕ должен возвращать итератор со значением, эквивалентным val?

Например:

vector<int> a = {1, 2, 3, 4};
auto i = lower_bound(a.begin(), a.end(), 2); // i is iterator at 2;
auto j = upper_bound(a.begin(), a.end(), 2); // j is iterator at 3;

http://www.cplusplus.com/reference/algorithm/lower_bound/

3
John Tan 25 Ноя 2016 в 19:33

2 ответа

Лучший ответ

В C ++ итераторы обычно работают парами. Первый итератор указывает на первый рассматриваемый элемент, а последний итератор указывает на один за последним элемент для рассмотрения. Это сделано для упрощения цикла:

for(it cur=first; cur!=last; cur++)

Таким образом, lower_bound и upper bound вместе образуют "диапазон всех элементов, равный искомому элементу. Тот же диапазон, который возвращает std::equal_range.

6
Mooing Duck 25 Ноя 2016 в 16:40

upper_bound полезно в таких случаях, как std::multimap, когда значения хранятся в отсортированном порядке. Это позволяет вам перемещаться в пределах диапазона, где начальная позиция может быть определена lower_bound, а end-before-this-position определяется upper_bound .

for (iter_type it = myMap.lower_bound("key_val"); it != myMap.upper_bound("key_val"); it++)

Этот цикл for будет проходить до точки key == key_val.

0
Saurav Sahu 25 Ноя 2016 в 16:53