C/C++

Программирование на с++, помощь в реолизации

Добрый вечер, у меня есть set и мне нужно в r записать индекс первого большее j, ну это просто auto r = set.lower_bound(j), а в l мне надо записать индекс первого меньше j. И хочется просто написать auto l = r - 1, но нет ошибку какую-то кидает, что делать(знаю что с итераторами у set там всё как-то с подковыркой, поэтому и спрашиваю другой какой-то способ)?
Чтобы найти элемент, который меньше j, вы можете использовать следующий код:
 auto r = my_set.lower_bound(j); 
auto l = std::prev(r);
Функция std::prev возвращает итератор, который указывает на предыдущий элемент относительно переданного итератора. В этом случае он вернет элемент, который меньше j. Однако обратите внимание, что если r является первым элементом в set, то у него нет предыдущего элемента и вызов std::prev(r) приведет к ошибке. В этом случае вам необходимо проверить, является ли r первым элементом в set, прежде чем вызывать std::prev(r). Например:
 auto r = my_set.lower_bound(j); 
if (r != my_set.begin()) {
auto l = std::prev(r);
// ...
}
Виктор Тисленко
Виктор Тисленко
25 860
Лучший ответ
Алексей Банников Спасибо, большое))
 #include  
#include
using namespace std;
int main() {
set box{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
cout > value;
if (!box.empty()) {
auto l = box.lower_bound(value);
if (l != box.begin()) {
l = prev(l);
cout
Михаил Козыренко Допустим и такой вариант!
 #include  
#include
using namespace std;
int main() {
set box{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
cout > value;
if (!box.empty()) {
auto [l, r] = box.equal_range(value);
if (l != box.begin()) {
l = prev(l);
cout
Первое большее - это upper_bound()
lower_bound() - первое не меньшее, т.е. может выдать равный j. Можно и от него отплясать.
т.е. после l = r = set.lower_bound(j) определить не равняется ли *r самой j. Если равняется, то сделать r на один больше ++r, а l на один меньше --l. Если не равняется, то только уменьшить l на один --l.
Разумеется нужно предусмотреть проверки на случай когда r = begin() или r = end(), чтобы не выйти за пределы сета.
АХ
Айрат Хузин
51 417