std::ranges::is_sorted
Определён в заголовке <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 bool
is_sorted( 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 bool
is_sorted( R&& r, Comp comp = {}, Proj proj = {} );
| (2) | (начиная с C++20) |
Проверяет, отсортированы ли элементы диапазона [first, last) в неубывающем порядке.
Последовательность отсортирована относительно компаратора comp, если для любого итератора it, указывающего на последовательность, и любого неотрицательного целого числа n, такого что it + n является допустимым итератором, указывающим на элемент последовательности, std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) имеет значение false.
comp.r, как если бы ranges::begin(r) использовался в качестве first, а ranges::end(r) — в качестве last.Функциональные объекты, описанные на этой странице, являются функциональными объектами алгоритмов (неформально известными как niebloids), то есть:
- При вызове любого из них нельзя указать явный список аргументов шаблона.
- Ни один из них не доступен для поиска с учётом аргументов.
- Если любой из них найден при обычном неквалифицированном поиске как имя слева от оператора вызова функции, поиск с учётом аргументов подавляется.
Параметры
| first, last | - | пара итератора и сентинела, задающая диапазон элементов, для которого проверяется, отсортирован ли он |
| r | - | диапазон элементов, для которого проверяется, отсортирован ли он |
| comp | - | функция сравнения, применяемая к спроецированным элементам |
| proj | - | проекция, применяемая к элементам |
Возвращаемое значение
true, если элементы диапазона отсортированы согласно comp.
Сложность
Линейная относительно расстояния между first и last.
Возможная реализация
struct is_sorted_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 bool operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
{
return ranges::is_sorted_until(first, last, comp, proj) == last;
}
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 bool operator()(R&& r, Comp comp = {}, Proj proj = {}) const
{
return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj));
}
};
inline constexpr is_sorted_fn is_sorted;
|
Примечания
ranges::is_sorted возвращает true для пустых диапазонов и диапазонов длины один.
Пример
#include <algorithm>
#include <array>
#include <functional>
#include <iostream>
#include <iterator>
int main()
{
namespace ranges = std::ranges;
std::array digits {3, 1, 4, 1, 5};
ranges::copy(digits, std::ostream_iterator<int>(std::cout, " "));
ranges::is_sorted(digits)
? std::cout << ": sorted\n"
: std::cout << ": not sorted\n";
ranges::sort(digits);
ranges::copy(digits, std::ostream_iterator<int>(std::cout, " "));
ranges::is_sorted(ranges::begin(digits), ranges::end(digits))
? std::cout << ": sorted\n"
: std::cout << ": not sorted\n";
ranges::reverse(digits);
ranges::copy(digits, std::ostream_iterator<int>(std::cout, " "));
ranges::is_sorted(digits, ranges::greater {})
? std::cout << ": sorted (with 'greater')\n"
: std::cout << ": not sorted\n";
}
Вывод:
3 1 4 1 5 : not sorted 1 1 3 4 5 : sorted 5 4 3 1 1 : sorted (with 'greater')
См. также
|
(C++20) | находит наибольший отсортированный поддиапазон (функциональный объект алгоритма) |
|
(C++11) | проверяет, отсортирован ли диапазон (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/ranges/is_sorted