Spec-Zone.ru › C++

std::ranges::min_element

Определён в заголовочном файле <algorithm>
Сигнатура вызова
template< std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
          std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less >
constexpr I
    min_element( I first, S last, Comp comp = {}, Proj proj = {} );
(1) (начиная с C++20)
template< ranges::forward_range R, class Proj = std::identity,
          std::indirect_strict_weak_order<
              std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less >
constexpr ranges::borrowed_iterator_t<R>
    min_element( R&& r, Comp comp = {}, Proj proj = {} );
(2) (начиная с C++20)
1) Находит наименьший элемент в диапазоне [first, last).
2) То же, что (1), но в качестве исходного диапазона используется r, как если бы ranges::begin(r) использовался в качестве first, а ranges::end(r) — в качестве last.

Описанные на этой странице функциональные объекты являются алгоритмическими функциональными объектами (неформально известными как niebloids), то есть:

  • При вызове любого из них нельзя указывать явные списки аргументов шаблона.
  • Ни один из них не виден при поиске с учётом аргументов.
  • Если любой из них найден при обычном неквалифицированном поиске как имя слева от оператора вызова функции, поиск с учётом аргументов подавляется.

Параметры

first, last - пара итератора и сентинела, определяющая диапазон элементов для проверки
r - range для проверки
comp - сравнение, применяемое к спроецированным элементам
proj - проекция, применяемая к элементам

Возвращаемое значение

Итератор на наименьший элемент в диапазоне [first, last). Если несколько элементов диапазона эквивалентны наименьшему элементу, возвращается итератор на первый такой элемент. Если диапазон пуст (то есть first == last), возвращается итератор, сравниваемый на равенство с last.

Сложность

Ровно max(N - 1, 0) сравнений, где N = ranges::distance(first, last).

Возможная реализация

struct min_element_fn
{
    template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
             std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less>
    constexpr I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
    {
        if (first == last)
            return last;
        auto smallest = first;
        while (++first != last)
            if (std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *smallest)))
                smallest = first;
        return smallest;
    }
  
    template<ranges::forward_range R, class Proj = std::identity,
             std::indirect_strict_weak_order<
                 std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r, Comp comp = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj));
    }
};

inline constexpr min_element_fn min_element;

Пример

#include <algorithm>
#include <array>
#include <cmath>
#include <iostream>
 
int main()
{
    namespace ranges = std::ranges;
 
    std::array v{3, 1, -13, 1, 3, 7, -13};
 
    auto iterator = ranges::min_element(v.begin(), v.end());
    auto position = ranges::distance(v.begin(), iterator);
    std::cout << "min element is v[" << position << "] == " << *iterator << '\n';
 
    auto abs_compare = [](int a, int b) { return (std::abs(a) < std::abs(b)); };
    iterator = ranges::min_element(v, abs_compare);
    position = ranges::distance(v.begin(), iterator);
    std::cout << "|min| element is v[" << position << "] == " << *iterator << '\n';
}

Вывод:

min element is v[2] == -13
|min| element is v[1] == 1

См. также

ranges::max_element
(C++20)
возвращает наибольший элемент диапазона
(алгоритмический функциональный объект)
ranges::minmax_element
(C++20)
возвращает наименьший и наибольший элементы диапазона
(алгоритмический функциональный объект)
ranges::max
(C++20)
возвращает большее из заданных значений
(алгоритмический функциональный объект)
min_element
возвращает наименьший элемент диапазона
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/ranges/min_element

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API