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 | - | диапазон для проверки |
| comp | - | сравнение для применения к проецированным элементам |
| proj | - | проекция для применения к элементам |
Возвращаемое значение
Итератор на наименьший элемент в диапазоне [first, last). Если несколько элементов в диапазоне эквивалентны наименьшему элементу, возвращается итератор на первый такой элемент. Возвращает first если диапазон пуст.
Сложность
Точно 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;
++first;
for (; first != last; ++first)
if (!std::invoke(comp, std::invoke(proj, *smallest), std::invoke(proj, *first)))
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 <cmath>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v {3, 1, -14, 1, 5, 9};
namespace ranges = std::ranges;
auto result = ranges::min_element(v.begin(), v.end());
std::cout << "min element at [" << ranges::distance(v.begin(), result)
<< "]\n";
auto abs_compare = [](int a, int b) { return (std::abs(a) < std::abs(b)); };
result = ranges::min_element(v, abs_compare);
std::cout << "|min| element at [" << ranges::distance(v.begin(), result)
<< "]\n";
}Вывод:
min element at [2] |min| element at [1]
См. также
|
(C++20) | возвращает наибольший элемент в диапазоне (niebloid) |
|
(C++20) | возвращает наименьший и наибольший элементы в диапазоне (niebloid) |
|
(C++20) | возвращает большее из заданных значений (niebloid) |
| возвращает наименьший элемент в диапазоне (функция-шаблон) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/ranges/min_element