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()

Откройте пример в Compiler Explorer.