std::ranges::is_sorted_until
Определено в заголовке <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
is_sorted_until( I first, S last, Comp comp = {}, Proj proj = {} );
| (1) | (с C++20) |
template< std::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>
is_sorted_until( R&& r, Comp comp = {}, Proj proj = {} );
| (2) | (с C++20) |
Рассматривает диапазон [first, last) и находит наибольший диапазон, начинающийся с first, в котором элементы отсортированы в порядке невозрастания.
Последовательность отсортирована относительно компаратора 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 | - | проекция для применения к элементам |
Возвращаемое значение
Верхняя граница наибольшего диапазона, начинающегося с first , в котором элементы отсортированы в порядке невозрастания. То есть, последний итератор it , для которого диапазон [first, it) отсортирован.
Сложность
Линейная по расстоянию между first и last.
Возможная реализация
struct is_sorted_until_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 first;
for (auto next = first; ++next != last; first = next)
if (std::invoke(comp, std::invoke(proj, *next), std::invoke(proj, *first)))
return next;
return first;
}
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 is_sorted_until_fn is_sorted_until; |
Примечания
ranges::is_sorted_until возвращает итератор, равный last для пустых диапазонов и диапазонов длиной один.
Пример
#include <array>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 g {rd()};
std::array nums {3, 1, 4, 1, 5, 9};
constexpr int min_sorted_size = 4;
int sorted_size = 0;
do
{
std::ranges::shuffle(nums, g);
const auto sorted_end = std::ranges::is_sorted_until(nums);
sorted_size = std::ranges::distance(nums.begin(), sorted_end);
std::ranges::copy(nums, std::ostream_iterator<int>(std::cout, " "));
std::cout << " : " << sorted_size << " leading sorted element(s)\n";
}
while (sorted_size < min_sorted_size);
}Возможный вывод:
4 1 9 5 1 3 : 1 leading sorted element(s) 4 5 9 3 1 1 : 3 leading sorted element(s) 9 3 1 4 5 1 : 1 leading sorted element(s) 1 3 5 4 1 9 : 3 leading sorted element(s) 5 9 1 1 3 4 : 2 leading sorted element(s) 4 9 1 5 1 3 : 2 leading sorted element(s) 1 1 4 9 5 3 : 4 leading sorted element(s)
См. также
|
(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_until