c ++ STL min_element - PullRequest
       8

c ++ STL min_element

0 голосов
/ 30 декабря 2018

Я хочу найти минимальный элемент в массиве, но если минимальный элемент появляется более одного раза, то я хочу последнее вхождение элемента.Я использовал 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 голосов
/ 30 декабря 2018

Если ваши данные хранятся в 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 .

0 голосов
/ 31 декабря 2018

Вы могли бы злоупотреблять из 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());
0 голосов
/ 30 декабря 2018

Дайте min_element обратные итераторы вместо:

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

Затем преобразуйте it обратно в "нормальный" итератор если вам нужно.

Ине забудьте исправить свой компаратор;это должно быть <, а не <=.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...