Мне нужна функция, которая берет вектор (предположительно отсортированный) и значение и возвращает ближайшее число, которое [править] больше меньше или равно этому числу, предпочтительно используяалгоритм из STL.Я придумал решение, использующее std :: lower_bound (), но оно кажется унылым и уродливым:
struct ClosestCmp {
bool operator()(const int & x, const int & y) { return x > y; }
};
// vec is assumed to be sorted
int closest(const std::vector<int> & vec, int value)
{
std::vector<int>::const_reverse_iterator cri =
std::lower_bound(vec.rbegin(), vec.rend(), value, ClosestCmp());
if (cri != vec.rend()) {
return *cri;
}
return -1;
}
// ...
vec.push_back(1);
vec.push_back(2);
vec.push_back(4);
vec.push_back(5);
std::cout << closest(vec, 2) << "\n"; // Should ouput "2"
std::cout << closest(vec, 3) << "\n"; // Should ouput "2"
std::cout << closest(vec, 4) << "\n"; // Should ouput "4"
Может кто-нибудь предложить более элегантный способ, возможно, с использованием алгоритма STL без необходимости в функции сравненияили обратный итератор?Я посмотрел в STL, но не смог найти лучшего решения, чем это.