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
См. также
|
(C++20) | возвращает наибольший элемент диапазона (алгоритмический функциональный объект) |
|
(C++20) | возвращает наименьший и наибольший элементы диапазона (алгоритмический функциональный объект) |
|
(C++20) | возвращает большее из заданных значений (алгоритмический функциональный объект) |
| возвращает наименьший элемент диапазона (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/ranges/min_element