Если it
является итератором первого элемента контейнера, тогда --it
является неопределенным поведением, то есть вы должны убедиться, что ваша программа этого не делает. Если это произойдет, может произойти что угодно, и это ошибка программы, а не компилятор или библиотека.
Таким образом, правильный способ найти самый большой элемент, меньший чем x
в std::set s
, который не содержит x
, это:
auto it = s.lower_bound(x);
if (it == s.begin())
std::cout << x << " is smaller than all elements of s\n";
else
std::cout << "The largest element in s smaller than " << x << " is "
<< *std::prev(it) << "\n";
(Это также правильно, если s
пусто: элемент s
отсутствует вообще, поэтому нет элемента меньше, чем x
, и "меньше, чем все элементы s
", равнозначно истине. )