如何在向量的给定索引范围内查找最小元素

How to find minimum element in a given range of indices for a vector?

本文关键字:查找 范围内 元素 索引 向量      更新时间:2023-10-16

如何在给定的索引范围内找到std::vector的最小元素?

假设向量是

vector<int> v = {1,2,3,4,5};

所以

min_element(v.begin(), v.end());

会给1.

但是,如果我们想要从指数13的最小值怎么办?

也就是说,在元素{2,3,4} v中,这是2

由于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。