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

时间:2019-01-31 23:31:23

标签: c++ algorithm stdvector minimum

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

让我们说向量是

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

所以

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

将给出1

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

那是 {2,3,4}中的v,即2

2 个答案:

答案 0 :(得分:7)

由于std::min_element的范围为[first, last)(从firstend为止),我们需要提供以下信息:

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。

答案 1 :(得分:-1)

这是我写的一个函数,用于查找给定范围的最小值并返回其索引。

int findMin(vector<int>& vec, int minRange=0, int maxRange=-1) {
    int min = vec[minRange];
    int minIndex = minRange;

    if(maxRange==-1) {
        maxRange = vec.length();
    }

    for(int i = minRange; i<maxRange; i++) {
        if(vec[i] < min) {
            min = vec[i];
            minIndex = i;
        }
    }

    return minIndex;
}