找到向量的给定索引范围中的最小元素

Swa*_* B. 2 c++ algorithm minimum stdvector c++11

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

让我们说矢量是

vector<int> v = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

所以

min_element(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

会给1.

但是如果我们想要从指数1到最小值3呢?

这是 {2,3,4}v这是2.

JeJ*_*eJo 10

由于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);
Run Code Online (Sandbox Code Playgroud)

或用std::next它来使它成为通用的(信用@Slava)

auto min = *std::min_element(std::next(v.begin(), 1), std::next(v.begin(), 4));
Run Code Online (Sandbox Code Playgroud)

要将其包装在辅助函数中:

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);
}
Run Code Online (Sandbox Code Playgroud)

现在在主力

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*/);
Run Code Online (Sandbox Code Playgroud)

查看实时示例


但是,请记住给定的迭代器是有效的,否则行为是UB.

  • 使用`std :: next()`而不是+会使它更通用. (4认同)
  • 如果比较元素抛出或内存分配失败,则“跟随异常”就等于抛出异常。这些都与迭代器的有效性无关-它们与所使用的算法有关。如果迭代器无效(例如,在不同的容器中),则该行为实际上是未定义的。 (2认同)