Только вы можете решить, стоит ли сохранение статус-кво риска. Однако, если вы перейдете к C++11
, формулировка изменится, чтобы учесть то, что вы делаете.
Я думаю, что маловероятно, что поставщики компиляторов изменят работу своей стандартной библиотеки для старой версии стандарта. Поэтому я не вижу большой вероятности того, что ваш код C++98
сломается, если вы не переместите его в непроверенный компилятор. И даже если бы это произошло, вы всегда могли бы реализовать свою собственную (замещающую) версию std::lower_bound
для размещения.
Согласно моему прочтению Стандарта C++11
, у вас все в порядке.
25.4.3.1 нижняя_граница [ нижняя.граница ]
template<class ForwardIterator, class T>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
template<class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
1 Требуется: Элементы e из [first,last) должны быть разделены относительно выражения e ‹ value или comp(e, value).
2 Возвращает: самый дальний итератор i в диапазоне [first,last] такой, что для любого итератора j в диапазоне [first,i) выполняются следующие соответствующие условия: *j ‹ value or comp(* j, значение) != ложь.
3 Сложность: не более log 2 (последнее – первое) + O(1) сравнений.
Требование 2 не требует, чтобы value
был того же типа, что и *e
.
Также в документе, на который вы ссылаетесь, говорится:
Но законно ли это? Позиция стандарта по этому вопросу не обнадеживает. Во-первых, в 25.3 говорится, что для правильной работы алгоритмов объект сравнения должен индуцировать строгое слабое упорядочение значений.
Это взято из Стандарта C++03
и не соответствует той формулировке, которую я нашел в Стандарте C++11
, в которой говорится следующее:
25.4 Сортировка и связанные операции [ alg.sorting ]
3 Для всех алгоритмов, использующих Compare, существует версия, в которой вместо этого используется оператор‹. То есть comp(*i, *j) != false по умолчанию *i ‹ *j != false. Для правильной работы алгоритмов, отличных от описанных в 25.4.3, comp должен индуцировать строгое слабое упорядочение значений.
Это дает явное исключение из алгоритма, используемого std::lower_bound
:
25.4.3 Двоичный поиск [ alg.binary.search ]
1 Все алгоритмы в этом разделе являются версиями бинарного поиска и предполагают, что искомая последовательность разделена относительно выражения, сформированного путем привязки ключа поиска к аргументу неявной или явной функции сравнения. .
Эта формулировка позволяет «аргументу» функции сравнения иметь тип, отличный от типа элементов контейнера. Он просто должен соответствовать «ключу поиска».
person
Galik
schedule
03.07.2017
std::iterator_traits<IteratorType>::value_type
вместоT
. - person Johannes Schaub - litb   schedule 03.07.2017element < value
илиcomp(element, value)
. И cppreference намеревается задокументировать, по словам их создателей, все стандарты от C++03 до C++17. - person Johannes Schaub - litb   schedule 03.07.2017C++11
, формулировка изменится, чтобы учесть то, что вы делаете. Маловероятно, что поставщики компиляторов изменят работу своей стандартной библиотеки для старой версии стандарта. - person Galik   schedule 03.07.2017