Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Сентябрь 09, 2017, 07:40



Название: Найти следующий/предыдущий
Отправлено: 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
Ну да, всё оказалось гораздо проще)