Ответ 1
Оберните его в лямбда:
std::partial_sum(v.begin(), v.end(), v.begin(), [](auto& a, auto& b) {
return std::min(a, b);
});
Итак, я столкнулся с этой проблемой: мне нужно заменить каждый элемент 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
. Оба кажутся неправильными, потому что можно ожидать, что стандартная библиотека будет иметь такую основную вещь, а также основные вещи часто сложно реализовать:)
Итак, вот мои вопросы:
initializer_list
перегрузка min
? Итак, С++ 11 нарушил код, основанный на явно созданных экземплярах std::min
?Спасибо!
Оберните его в лямбда:
std::partial_sum(v.begin(), v.end(), v.begin(), [](auto& a, auto& b) {
return std::min(a, b);
});
Вы можете инициализировать переменную-указатель-к-функции соответствующего типа и передать это или явно static_cast.
int& (*min)(int&, int&) = std::min<int>;
std::partial_sum(v.begin(), v.end(), v.begin(), min);