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) | находит наибольший отсортированный поддиапазон (niebloid) |
|
(C++11) | проверяет, отсортирован ли диапазон в порядке возрастания (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/ranges/is_sorted