C ++ STL min_element

时间:2018-12-30 16:19:08

标签: c++ stl

我想在数组中找到最小元素,但是如果最小元素出现多次,那么我希望该元素的最后一次出现。我在std::min_element()函数中使用了comp()

vector<int>::iterator it=min_element(input.begin(), input.end(),comp);
cout << *it << endl;
cout << distance(input.begin(), it);

bool comp(int a, int b) {
if (a <= b)
    return true;
else
    return false;
}

此代码给出错误,表明输入3 3 4上的比较器无效。

3 个答案:

答案 0 :(得分:3)

改为给min_element反向迭代器:

vector<int>::reverse_iterator it=min_element(input.rbegin(), input.rend(),comp);

然后将it转换回所需的“普通”迭代器 iff

也不要忘记更正您的比较器;它必须是<而不是<=

答案 1 :(得分:1)

您可能会std::minmax_element中的滥用,它返回与std::max_element相反的最后一个最大元素:

auto last_min_it = std::minmax_element(input.begin(), input.end(), std::greater<>{}).second;

我可能会对std::min_element使用反向迭代器,

auto min_rev_it = std::min_element(input.rbegin(), input.rend());

答案 2 :(得分:0)

如果您的数据存储在vector中,则已经建议使用反向迭代器就足够了。

更一般而言,标准库不提供1中也提供的min_element_last函数。在这方面,min_element_last的可能实现可能为:

template <typename I>
using ValueType = typename std::iterator_traits<I>::value_type;

template <typename I, typename R>
// I models ForwardIterator
// R models StrictWeakOrdering on ValueType<I>
I min_element_last(I first, I last, R cmp) {
    if (first == last) return last;
    I curr = first;
    ++first;
    while (first != last) {
        if (!cmp(*curr, *first)) {
            curr = first;
        }
        ++first;
    }
    return curr;
}

template <typename I>
// I models ForwardIterator
// ValueType<I> models TotallyOrdered
I min_element_last(I first, I last) {
    using T = ValueType<I>;
    return min_element_last(first, last, std::less<T>());
}

优点是可以将min_element_last与仅对 ForwardIterator 概念建模的迭代器一起使用。