Как проверить, есть ли элемент <x в наборе C++

Есть ли элемент, который меньше заданного x в std::set s
Если нет print, "x меньше, чем любой элемент", если есть, то print "самый большой элемент, который меньше x".
Кстати, вы также знаете, что х не входит в набор

является:

cin >> x;
auto it = s.lower_bound(x);  
it--;
if (it == s.begin()) 
    cout << "x is the smallest element in s\n"
else
    cout << *it;

ОК?

Больше вопросов:

если это = s.begin(), то если вы сделаете --it, что это будет? если * это наименьший элемент в наборе, то если вы сделаете --it, что это будет?

2 ответа

lower_bound вернет итератор, указывающий после всех элементов, которые меньше x - то есть, указывая на первый элемент, больший или равный x, Так что, если он вернется s.begin()тогда все элементы> = x (никто не меньше). Так что хорошо бы прямо ответить на ваш вопрос:

if (s.lower_bound(x) == s.begin())
    cout << "x is smaller than all elements of s";

Если 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"Пусто верно.)

Другие вопросы по тегам