Russian Qt Forum
Сентябрь 21, 2017, 08:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Найти следующий/предыдущий  (Прочитано 312 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9797


Просмотр профиля
« : Сентябрь 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
Да, ну и конечно без перебора (мы же культурные люди)

Спасибо


« Последнее редактирование: Сентябрь 09, 2017, 08:19 от Igors » Записан
m_ax
Neo
******
Offline Offline

Сообщений: 1747



Просмотр профиля
« Ответ #1 : Сентябрь 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 уж сами-сами)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9797


Просмотр профиля
« Ответ #2 : Сентябрь 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). А у Вас что вернет?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9797


Просмотр профиля
« Ответ #3 : Сентябрь 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;
}
 
Нигде не насвистел?
Записан
m_ax
Neo
******
Offline Offline

Сообщений: 1747



Просмотр профиля
« Ответ #4 : Сентябрь 11, 2017, 14:51 »

Ну да, всё оказалось гораздо проще) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.155 секунд. Запросов: 22.