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 << ": отсортировано\n" : std::cout << ": не отсортировано\n"; ranges::sort(digits); ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(ranges::begin(digits), ranges::end(digits)) ? std::cout << ": отсортировано\n" : std::cout << ": не отсортировано\n"; ranges::reverse(digits); ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(digits, ranges::greater {}) ? std::cout << ": отсортировано (с 'greater')\n" : std::cout << ": не отсортировано\n"; }
Вывод:
3 1 4 1 5 : не отсортировано 1 1 3 4 5 : отсортировано 5 4 3 1 1 : отсортировано (с 'greater')
См. также
(C++20) |
находит наибольший отсортированный поддиапазон (функциональный объект алгоритма) |
(C++11) |
проверяет, отсортирован ли диапазон (шаблон функции) |