Daily bit(e) C++ #228. Два алгоритма, проверяющие, отсортирован ли диапазон в невозрастающем порядке: std::is_sorted, std::is_sorted_until.
Алгоритмы C++11 std::is_sorted и std::is_sorted_until проверяют, что предоставленный диапазон отсортирован в неубывающем порядке (с использованием оператора‹ или компаратора ).
Алгоритм 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 // Note, that while technically the above is equivalent to // std::ranges::is_sorted(sort, {}, &std::string::length); // it would be undefined behaviour as we are not permitted to // take address of standard functions (including members). auto r4 = std::ranges::is_sorted_until(sort, [](const auto& l, const auto& r) { return l.length() < r.length(); }); // r4 == sort.end()