由于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*/);
See a live example
但是,请确保给定的迭代器是有效的,否则行为是 UB。