Подтвердить что ты не робот

Использование `std:: min` в качестве параметра алгоритма

Итак, я столкнулся с этой проблемой: мне нужно заменить каждый элемент std::vector<int> на минимум того, что было до него (включительно).

Естественно, что std::partial_sum приходит в голову - если бы я мог пройти std::min как BinaryOp, он выполнил бы эту работу.

Ну получается, что я не могу этого сделать, потому что std::min<int> является перегруженной функцией - он работает как для шаблонов int, так и initializer_list<int> и partial_sum не может быть создан с неизвестным типом.

Обычно это разрешается с помощью класса с шаблоном operator(), например std::plus<void> и т.д., но стандартная библиотека, похоже, не имеет одного для min и max.

Мне кажется, что я либо должен реализовать свой собственный T min<T>(T,T), который будет точным клоном std::min, за исключением отсутствия перегрузки initializer_list, или для реализации моего собственного class min сродни std::plus. Оба кажутся неправильными, потому что можно ожидать, что стандартная библиотека будет иметь такую ​​основную вещь, а также основные вещи часто сложно реализовать:)

Итак, вот мои вопросы:

  • Есть ли способ правильный решить эту проблему? то есть без введения новых неопределенных конструкций/записи более чем нескольких строк кода.
  • Правильно ли предположить, что это стало проблемой в С++ 11, после того, как была введена initializer_list перегрузка min? Итак, С++ 11 нарушил код, основанный на явно созданных экземплярах std::min?

Спасибо!

4b9b3361

Ответ 1

Оберните его в лямбда:

std::partial_sum(v.begin(), v.end(), v.begin(), [](auto& a, auto& b) {
    return std::min(a, b);
});

Ответ 2

Вы можете инициализировать переменную-указатель-к-функции соответствующего типа и передать это или явно static_cast.

int& (*min)(int&, int&) = std::min<int>;
std::partial_sum(v.begin(), v.end(), v.begin(), min);