Daily bit(e) C++. std::is_sorted, std::is_sorted_until
Daily bit(e) C++ #228, два алгоритма, проверяющие, отсортирован ли диапазон в невозрастающем порядке: std::is_sorted
, std::is_sorted_until
.
Алгоритмы из C++11 std::is_sorted
и std::is_sorted_until
проверяют, отсортирован ли предоставленный диапазон в неубывающем порядке (с использованием operator<
или компаратора).
Алгоритм std::is_sorted
возвращает логическое значение; а std::is_sorted_until
возвращает итератор для первого элемента, находящегося вне порядка.
Оба алгоритма предоставляют параллельную (C++17), constexpr
(C++20) и диапазонную (C++20) версии.
#include <algorithm>
#include <vector>
std::vector<int> nonsort{1,2,3,4,5,2,7,8,9};
auto r1 = std::is_sorted(nonsort.begin(), nonsort.end());
// r1 == false
auto r2 = std::is_sorted_until(nonsort.begin(), nonsort.end());
// r2 == nonsort.begin()+5, *r2 == 2
std::vector<std::string> sort{"x","mn","xyz","ijkl","abcde"};
auto r3 = std::ranges::is_sorted(sort,
[](const auto& l, const auto& r) {
return l.length() < r.length();
});
// r3 == true
// Обратите внимание, что хотя технически приведенный
// выше код эквивалентен
// std::ranges::is_sorted(sort, {}, &std::string::length);
// Это вызвало бы неопределенное поведение, поскольку нам
// не разрешено использовать адреса стандартных функций
// (включая члены).
auto r4 = std::ranges::is_sorted_until(sort,
[](const auto& l, const auto& r) {
return l.length() < r.length();
});
// r4 == sort.end()
Открыть пример на Compiler Explorer.