Namespaces
Variants

std::ranges::is_sorted

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に関するアルゴリズム (C++20)
制約付きアルゴリズム (例: ranges::copy, ranges::sort, ...)
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割済み範囲に対して)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書式比較操作
順列操作


 
制約付きアルゴリズム
このメニューのすべての名前は名前空間 std::ranges
非変更シーケンス操作
変更シーケンス操作
分割操作
ソート操作
二分探索操作 (ソート済み範囲に対して)
       
       
集合操作 (ソート済み範囲に対して)
ヒープ操作
最小/最大操作
       
       
順列操作
畳み込み操作
数値操作
(C++23)            
未初期化ストレージに対する操作
戻り値の型
 
ヘッダ <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 bool
    is_sorted( I first, S last, Comp comp = {}, Proj proj = {} );
(1) (C++20 以降)
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 bool
    is_sorted( R&& r, Comp comp = {}, Proj proj = {} );
(2) (C++20 以降)

範囲 [first, last) の要素が非降順にソートされているかどうかを調べます。

シーケンスは、比較関数 comp に関してソートされているとは、シーケンスを指す任意のイテレータ it と、n がシーケンスの要素を指す有効なイテレータとなる任意の非負整数 it + n に対して、std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) が false と評価される場合を言います。

1) 要素は与えられた二項比較関数 comp を使用して比較されます。
2) (1) と同じですが、 をソース範囲として使用し、あたかも を r として、ranges::begin(r) を first として使用するかのように動作します。ranges::end(r) と last はそれぞれ ranges::begin(r) と ranges::end(r) を指します。

このページで説明されている関数のようなエンティティは アルゴリズム関数オブジェクト (非公式には niebloid として知られています) であり、すなわち:

パラメータ

first, last - ソートされているか確認する要素の 範囲 を定義するイテレータ-番兵ペア
r - ソートされているか確認する要素の範囲
comp - 投影された要素に適用する比較関数
proj - 要素に適用する投影

戻り値

true 範囲内の要素が comp に従ってソートされている場合。

計算量

first と last の間の距離に対して線形。

実装例

struct is_sorted_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 bool operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
    {
        return ranges::is_sorted_until(first, last, comp, proj) == last;
    }
    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 bool 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_fn is_sorted;

注記

ranges::is_sorted は空の範囲および長さ1の範囲に対して true を返します。

例

#include <algorithm>
#include <array>
#include <functional>
#include <iostream>
#include <iterator>
int main()
{
    namespace ranges = std::ranges;
    std::array digits {3, 1, 4, 1, 5};
    ranges::copy(digits, std::ostream_iterator<int>(std::cout, " "));
    ranges::is_sorted(digits)
        ? std::cout << ": sorted\n"
        : std::cout << ": not sorted\n";
    ranges::sort(digits);
    ranges::copy(digits, std::ostream_iterator<int>(std::cout, " "));
    ranges::is_sorted(ranges::begin(digits), ranges::end(digits))
        ? std::cout << ": sorted\n"
        : std::cout << ": not sorted\n";
    ranges::reverse(digits);
    ranges::copy(digits, std::ostream_iterator<int>(std::cout, " "));
    ranges::is_sorted(digits, ranges::greater {})
        ? std::cout << ": sorted (with 'greater')\n"
        : std::cout << ": not sorted\n";
}

出力:

3 1 4 1 5 : not sorted
1 1 3 4 5 : sorted
5 4 3 1 1 : sorted (with 'greater')

関連項目

最も長いソートされた部分範囲を見つける
(アルゴリズム関数オブジェクト)
(C++11)
範囲がソートされているかどうかをチェックする
(関数テンプレート)