Как проверить, есть ли элемент <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
"Пусто верно.)