簡體   English   中英

C ++ STL min_element

[英]c++ STL min_element

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

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上的比較器無效。

min_element反向迭代器:

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

然后將其轉換it 當且僅當你需要恢復到“正常”的迭代器。

並且不要忘記校正您的比較器; 它必須是< not <=

您可能會濫用 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());

如果您的數據存儲在vector ,則已經建議使用反向迭代器就足夠了。

更一般地,標准庫不提供min_element_last函數,如1中所述 在這方面, 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概念建模的迭代器一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM