Мне нужна функция, которая принимает вектор (предполагается, что он отсортирован) и значение, и возвращает самое близкое число, которое [edit] больше меньше или равно этому числу, предпочтительно используя алгоритм из 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, но не смог найти лучшего решения, чем это.