Название: Найти следующий/предыдущий
Отправлено: Igors от Сентябрь 09, 2017, 07:40
Добрый день Казалось бы - ну "простейшая", "элементарная" (что впрочем не одно и то же) задачка, а мне почему-то пришлось пыхтеть, напрягаться :'( Наверное я плохо понимаю std. Нужно всего-то написать 2 ф-ции C++ (Qt) int GetNext( const std::vector<double> & src, double value, double tolerance ); int GetPrev( const std::vector<double> & src, double value, double tolerance );
Найти индекс эл-та со значением ближайшим к value, но чтобы при этом выполнялось условие vec[index] - value > tolerance // для GetNext value - vec[index] > tolerance // для GetPrev Если индекс невалиден, то вернуть -1. Примеры C++ (Qt) vec = { 0, 1, 2, 3, 4, 5 }; GetNext(vec, 3.7, 0.1) = 4 GetPrev(vec, 3.7, 0.1) = 3 GetNext(vec, 3.999, 0.1) = 5 GetPrev(vec, 3.999, 0.1) = 3 GetNext(vec, 4.999, 0.1) = -1 GetPrev(vec, 4.999, 0.1) = 4 Др словами юзер может "шагать" по эл-там вектора вперед и взад, учитывая при этом погрешность value Да, ну и конечно без перебора (мы же культурные люди) Спасибо
Название: Re: Найти следующий/предыдущий
Отправлено: m_ax от Сентябрь 09, 2017, 11:33
Наверное я плохо понимаю std.
Согласен) Аналог GetNext: C++ (Qt) int GetNext( const std::vector<double> & src, const double & value, const double & tolerance) { auto it = std::lower_bound(src.begin(), src.end(), value, [&](const double & x, const double & val)->bool { return ((x - val) < tolerance); }); return (it != src.end()) ? it - src.begin() : -1; }
С GetPrev уж сами-сами)
Название: Re: Найти следующий/предыдущий
Отправлено: Igors от Сентябрь 10, 2017, 03:41
C++ (Qt) int GetNext( const std::vector<double> & src, const double & value, const double & tolerance) { auto it = std::lower_bound(src.begin(), src.end(), value, [&](const double & x, const double & val)->bool { return ((x - val) < tolerance); }); return (it != src.end()) ? it - src.begin() : -1; }
Проверяем C++ (Qt) vec = { 0, 0.91, 0.92, 3 }; GetNext(vec, 0.9, 0.1) = ???
"Правельный ответ" - указатель на 3 (индекс тоже 3). А у Вас что вернет?
Название: Re: Найти следующий/предыдущий
Отправлено: Igors от Сентябрь 11, 2017, 10:21
Да и вообще не понял к чему тут хвунктор. Мой вариант C++ (Qt) int GetNext( const std::vector<double> & src, double value, double tolerance ) { auto it = std::lower_bound(src.begin(), src.end(), value + tolerance); return (it != src.end()) ? std::distance(src.begin(), it) : -1; } int GetPrev( const std::vector<double> & src, double value, double tolerance ) { auto it = std::upper_bound(src.begin(), src.end(), value - tolerance); return std::distance(src.begin(), it) - 1; }
Нигде не насвистел?
Название: Re: Найти следующий/предыдущий
Отправлено: m_ax от Сентябрь 11, 2017, 14:51
Ну да, всё оказалось гораздо проще)
|