Алгоритм STL для наименьшего максимального элемента, чем заданное значение

Недавно я наткнулся на этот фрагмент кода:

// look for element which is the smallest max element from
// a given iterator
int diff = std::numeric_limits<int>::max();
auto it = nums.rbegin();
auto the_one = nums.rbegin();

for (; it != given; ++it) // this terminates
{
int local_diff = *it - *given;
// if the element is less than/equal to given we are not interested
if (local_diff <= 0)
continue;

if (local_diff < diff)
{
// this update the global diff
diff = local_diff;
the_one = it;
}
}

Мне было интересно, если кто-нибудь может придумать элегантный алгоритм STL, чтобы заменить вышесказанное. По сути, мы должны пройти через все элементы, а также отслеживать тот, который нам нужен. Это не похоже на std::max_element (по крайней мере, я не могу смоделировать это так).

-1

Решение

auto the_one = std::min_element(nums.rbegin(), given,
[given](int a, int b) {
bool good_a = a > *given;
bool good_b = b > *given;
return (good_a && good_b) ? a < b : good_a;
});

Хитрость заключается в том, чтобы написать функцию сравнения, которая объявляет любой «хороший» элемент (тот, который больше, чем *given) сравнивать меньший, чем любой «нехороший» элемент. Два «хороших» элемента сравниваются нормально; два «плохих» элемента всегда объявляются эквивалентными.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector