Как проверить, есть ли элемент <x в наборе C ++ - PullRequest
0 голосов
/ 28 августа 2018

Есть ли элемент, который меньше заданного 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 ]

0 голосов
/ 29 августа 2018

Если 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", равнозначно истине. )

0 голосов
/ 29 августа 2018

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

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