Элегантный способ найти ближайшее значение в векторе сверху

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

21
задан josmith42 27 December 2011 в 21:02
поделиться