Daily bit(e) C++. std::is_sorted, std::is_sorted_until

Добавлено 25 сентября 2023 в 05:17

Daily bit(e) C++ #228, два алгоритма, проверяющие, отсортирован ли диапазон в невозрастающем порядке: std::is_sorted, std::is_sorted_until.

Daily bit(e) C++

Алгоритмы из 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.

Теги

C++ / CppDaily bit(e) C++STL / Standard Template Library / Стандартная библиотека шаблоновПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.