Поскольку std::min_element
работает в диапазоне [first, last)
(от first
до одного прошлого end
), нам необходимо предоставить следующие данные:
const auto begin = v.begin() + 1;
const auto end = begin + 3;
int min = *std::min_element(begin, end);
или использовать std::next
, чтобы сделать его родовым (кредиты @Slava)
auto min = *std::min_element(std::next(v.begin(), 1), std::next(v.begin(), 4));
Чтобы обернуть его в вспомогательную функцию:
template<typename Container, typename Predicate = std::less<>>
auto min_element(
const Container &container,
std::size_t startIdx,
std::size_t endIdx,
const Predicate pred = {}) -> std::decay_t<decltype(*(container.begin()))>
// typename Container::value_type // or simply
{
return *std::min_element(std::next(container.begin(), startIdx),
std::next(container.begin(), ++endIdx), pred);
}
теперь в основной
std::vector<int> v = { 1, 3, 5, 2, 1 };
const auto startIndex = 1u, endIndex = 3u;
const int min = ::min_element(v, startIndex, endIndex /*, predicate if any*/);
См. Живой пример
Однако убедитесь, что данные итераторы верны, в противном случае поведение будет UB.