Namespaces
Variants

std::ranges::is_sorted_until

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に関するアルゴリズム (C++20)
制約付きアルゴリズム(例: ranges::copy, ranges::sort, ...)
変更操作を行わないシーケンス操作    
一括操作
(C++17)
検索操作
変更操作を行うシーケンス操作
コピー操作
(C++11)
(C++11)
交換操作
変換操作
生成操作
削除操作
順序変更操作
(C++17 まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートと関連操作
分割操作
(C++11)    

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


 
制約付きアルゴリズム
このメニューのすべての名前は名前空間 std::ranges
に属します
(C++23)
unique_copy
stable_partition
partial_sort_copy
equal_range
set_symmetric_difference
pop_heap
clamp
prev_permutation
fold_left_first  
fold_right
fold_right_last  
fold_left_with_iter
fold_left_first_with_iter
(C++23)
iota            
(C++23)
generate_random
(C++26)
uninitialized_value_construct_n
 
(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 I
    is_sorted_until( I first, S last, Comp comp = {}, Proj proj = {} );
で定義 呼び出しシグネチャ
template< std::forward_range R, class Proj = std::identity,
          std::indirect_strict_weak_order<
              std::projected<ranges::iterator_t<R>, Proj>>
                  Comp = ranges::less >
constexpr ranges::borrowed_iterator_t<R>
    is_sorted_until( R&& r, Comp comp = {}, Proj proj = {} );
(1) (C++20 以降)

(2) [first, last)(C++20 以降)first範囲

を調べ、要素が非降順にソートされている、comp で始まる最大の範囲を見つけます。 itシーケンスは、比較子 n に関してソートされているとは、シーケンスを指す任意のイテレータ it + n および std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) がシーケンスの要素を指す有効なイテレータであるような任意の非負整数 false について、

が と評価される場合を言います。 comp1)
要素は、指定された二項比較関数 を使用して比較されます。2) (1) と同じですが、r をソース範囲として使用し、あたかも ranges::begin(r) を first として、ranges::end(r) を last として使用するかのように動作します。

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

パラメータ

first, last - ソート済み上限境界を求める要素の 範囲 を定義するイテレータ-センチネルペア
r - ソート済み上限境界を求める範囲
comp - 投影された要素に適用する比較関数
proj - 要素に適用する投影

戻り値

first から始まる最大範囲の上限。この範囲内の要素は非減少順にソートされています。つまり、範囲 [ first , it ) がソートされている最後のイテレータ it を指します。

計算量

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

実装例

struct is_sorted_until_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 I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
    {
        if (first == last)
            return first;
        for (auto next = first; ++next != last; first = next)
            if (std::invoke(comp, std::invoke(proj, *next), std::invoke(proj, *first)))
                return next;
        return first;
    }
    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 ranges::borrowed_iterator_t<R>
        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_until_fn is_sorted_until;

注記

ranges::is_sorted_until は、空の範囲および長さ1の範囲に対して last に等しいイテレータを返します。

例

#include <array>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
int main()
{
    std::random_device rd;
    std::mt19937 g {rd()};
    std::array nums {3, 1, 4, 1, 5, 9};
    constexpr int min_sorted_size = 4;
    int sorted_size = 0;
    do
    {
        std::ranges::shuffle(nums, g);
        const auto sorted_end = std::ranges::is_sorted_until(nums);
        sorted_size = std::ranges::distance(nums.begin(), sorted_end);
        std::ranges::copy(nums, std::ostream_iterator<int>(std::cout, " "));
        std::cout << " : " << sorted_size << " leading sorted element(s)\n";
    }
    while (sorted_size < min_sorted_size);
}

出力例:

4 1 9 5 1 3  : 1 leading sorted element(s)
4 5 9 3 1 1  : 3 leading sorted element(s)
9 3 1 4 5 1  : 1 leading sorted element(s)
1 3 5 4 1 9  : 3 leading sorted element(s)
5 9 1 1 3 4  : 2 leading sorted element(s)
4 9 1 5 1 3  : 2 leading sorted element(s)
1 1 4 9 5 3  : 4 leading sorted element(s)

関連項目

範囲がソートされているかどうかを調べる
(アルゴリズム関数オブジェクト)
最大のソート済み部分範囲を見つける
(関数テンプレート)