const auto fpsRange = std::ranges::iota_view(1, 32);
auto it = fpsRange.begin();
std::advance(it, 100); // Ok
std::advance(it, -10); // UB
что за фигня? Там же внутри итератора простое число хранится. Почему не разрешить обратный проход?
Или может кто знает, как сделать с минимумом телодвижений двунаправленный. Идея в том, чтобы заработал такой код
const auto testFps = [](int fps) { return fps < 15; };
auto it = std::ranges::lower_bound(fpsRange, true, std::ranges::less{}, [&](int fps){ return !testFps(fps); });
Здравствуйте, sergii.p, Вы писали:
SP>всем привет. Такая проблема.
SP>
SP>const auto fpsRange = std::ranges::iota_view(1, 32);
SP>auto it = fpsRange.begin();
SP>std::advance(it, 100); // Ok
SP>std::advance(it, -10); // UB
SP>
SP>что за фигня? Там же внутри итератора простое число хранится. Почему не разрешить обратный проход? SP>Или может кто знает, как сделать с минимумом телодвижений двунаправленный. Идея в том, чтобы заработал такой код
SP>
Здравствуйте, rg45, Вы писали:
R>Вообще, странный какой-то случай — бинарный поиск по арфметической последовательности. Нафига искать то, что вычисляется с константной сложностью?
да, у меня странный случай. У камеры есть максимальный fps, который она отдаёт. Но камера запросто его может не поддерживать а отдавать только потому, что он там жёстко прошит. Поэтому из последовательности fps: 1, 2, 3 ... н-р 30 надо выбрать максимальный, который камера ещё принимает. Каждая попытка — обращение по сети — долго. В общем, бинарный поиск тут самое то. Да и я же использую не арифметическую последовательность, а проекцию по ней.
Здравствуйте, sergii.p, Вы писали:
SP>да, у меня странный случай. У камеры есть максимальный fps, который она отдаёт. Но камера запросто его может не поддерживать а отдавать только потому, что он там жёстко прошит. Поэтому из последовательности fps: 1, 2, 3 ... н-р 30 надо выбрать максимальный, который камера ещё принимает. Каждая попытка — обращение по сети — долго. В общем, бинарный поиск тут самое то. Да и я же использую не арифметическую последовательность, а проекцию по ней.
Ну это ты реализовал через поиск и через проекцию, непонятно зачем. Тебе же, имея значения 15, нужно найти значение 14? А имея значение 20, значение 19? Возникает ощущение, что помимо значений, для тебя какую-то ценность имеют также итераторы этой арифметической последовательности.
Ну либо у тебя какой-то обобщённый алгоритм, на вход которого могут приходить произвольные упорядоченные последовательности, в т.ч. и разреженные, а iota ты используешь просто для тестирования?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Тебе же, имея значения 15, нужно найти значение 14? А имея значение 20, значение 19?
функция testFps чисто для отладки. На самом деле это что-то
auto testFps = [](const int fps) {
const auto config = createConfig(fps);
const auto errCode = sendRequest(config);
if(errCode == WrongFps) return false;
else if(errCode == NoError) return true;
else return repeatRequest(config);
};
то есть число 15 сидит где-то в камере. Но она его не отдаёт. Потому что там сидят такие же раздолбаи-программисты и могут выдавать чушь в ответах. Камера отдаёт только теоретически возможный fps (н-р 30). А нужно найти реальный, который камера способна принимать. Короче, классическая игра "угадай число". Вот в учебниках какие-то мудрённые алгоритмы пишут. А надо так
const auto askNum = [](int num) { std::cout << "Загаданное число меньше " << num << "? (l|g)"; char answer; std::cin >> answer; return answer == 'l'; };
const auto sequence = std::iota_view(1, 100);
const auto littleBitMagic = 42;
auto it = std::ranges::lower_bound(sequence, littleBitMagic, [&](int num, int) { return askNum(num); } });
std::cout << "Ответ: " << *it;
но это если бы дедушка была бабушкой iota_view умел ходить взад.
Здравствуйте, sergii.p, Вы писали:
SP>всем привет. Такая проблема.
SP>
SP>const auto fpsRange = std::ranges::iota_view(1, 32);
SP>auto it = fpsRange.begin();
SP>std::advance(it, 100); // Ok
SP>std::advance(it, -10); // UB
SP>
SP>что за фигня? Там же внутри итератора простое число хранится. Почему не разрешить обратный проход? SP>Или может кто знает, как сделать с минимумом телодвижений двунаправленный. Идея в том, чтобы заработал такой код
SP>
https://godbolt.org/z/x8jbYn9qq Похоже только prev/advance валится. Странно, я думал, lower_bound реализован на этих примитивах. Походу это не так. Но всё равно страшно такое тащить в прод. Похоже классическое UB.
Здравствуйте, sergii.p, Вы писали:
SP>Здравствуйте, Chorkov, Вы писали:
C>>https://godbolt.org/z/YWM4Ya8rh C>>"У меня все работает".
SP>https://godbolt.org/z/x8jbYn9qq Похоже только prev/advance валится. Странно, я думал, lower_bound реализован на этих примитивах. Походу это не так. Но всё равно страшно такое тащить в прод. Похоже классическое UB.