2015-02-12 3 views
3

В двоичном предикате значение итератора передается как второй аргумент, а в lower_bound значение итератора передается в качестве первого аргумента.Почему предикатная версия lower_bound и upper_bound передает значение итератора непоследовательно?

Какова причина здесь? И имеет значение, помню ли я эту деталь или нет, когда писал свои собственные двоичные предикаты?


Примечание моя ссылка www.cplusplus.com (который я сказал, не может быть лучшим ссылки), и я подтвердил это, посмотрев на реализацию в stl библиотеки поставляется с VC++.

+3

Алгоритмы используют меньше, чем для сравнения элементов (! (A

+1

Не знаете, о чем говорите. Вы проверили справочную документацию ['std :: upper_bound'] (http://en.cppreference.com/w/cpp/algorithm/upper_bound) и [' std :: lower_bound'] (http: // en .cppreference.com/w/cpp/algorithm/lower_bound) на 'cppreference.com'? Это должен быть ваш ресурс для поиска стандартных документов библиотеки. – 5gon12eder

+0

Возможно, вы можете использовать тот же предикат для 'std :: sort' и' std :: lower_bound' и 'std :: upper_bound' и т. Д., Которые используют предикат как отношение« меньше ». – SirGuy

ответ

6

Это намеренно. Вы можете использовать один и тот же компаратор для обоих алгоритмов. Рассмотрим описания. lower_bound:

Возвращает итератор, указывающий на первый элемент в диапазоне [первый, последний), которое не менее, чем (т.е. большего или равное) значение.

и upper_bound:

Возвращает итератор, указывающий на первый элемент в диапазоне [первый, последний), которое больше, чем значение.

Учитывайте, что стандартным компаратором является <. Для реализации обоих алгоритмов с < потребуется !(elem < value) для одного и value < elem для другого. Прямо из этого следует прямое обращение порядка аргументов.

Это не должно влиять на то, как вы реализуете свой Компаратор.

Смежные вопросы