Как я могу получить строго меньшее значение, чем верхняя граница в std::set?

#c #stdset

#c #stdset

Вопрос:

Допустим, у меня есть набор

s= {1 5 10}

Теперь, если я запускаю цикл для [0,2] и каждый раз проверяю строго нижнюю, чем верхняя, границу набора, как я могу обрабатывать меньшее значение, чем s.begin() ? Смотрите Код для получения дополнительных разъяснений-

     set<int>s;
    s={1,5,10};
    for(auto i:s)
    {
        cout<<i<<"nn";
        for(int j=0;j<3;  j)
        {
            auto it=s.upper_bound(j);
            cout<<"For upper_bound of "<<j<<" ->"<<*it<<"~~~";
            it--;
            cout<<"For strictly lower than upper_bound of "<<j<<" ->"<<*it<<"n";
        }
        cout<<endl;
    }
 

Здесь For strictly lower than upper_bound of 0 -> 3 .Здесь одним из возможных решений может быть всегда проверка на большее или равное значение , чем s.begin() .Есть ли какой-нибудь другой лучший способ сделать это?

Ответ №1:

Вы можете вернуть std::optional if (it == s.begin()) и, соответственно, вывести какое-нибудь подходящее значение по умолчанию, например, none.

 auto strictly_lower = [amp;] () -> std::optional<int> {
                if(it == s.begin()) {
                    return std::nullopt;
                }
                it--;
                return std::optional{*it};
            }();
            
std::cout<<"For strictly lower than upper_bound of "<<j<<" ->"<< (strictly_lower.has_value() ? std::to_string(*strictly_lower) : "none") <<"n";
 

Ссылка на код