名前空間
変種
操作

std::is_partitioned

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
is_partitioned
(C++11)

ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
ヘッダー <algorithm> で定義
template< class InputIt, class UnaryPred >
bool is_partitioned( InputIt first, InputIt last, UnaryPred p );
(1) (C++11以降)
(C++20 以降 constexpr)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >

bool is_partitioned( ExecutionPolicy&& policy,

                     ForwardIt first, ForwardIt last, UnaryPred p );
(2) (C++17以降)
1) [firstlast) が述語 p によって分割されているかチェックします。つまり、p を満たす全ての要素が満たさない全ての要素より前に出現するかどうかです。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、以下のすべての条件が満たされた場合にのみオーバーロード解決に参加します。

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>true である。

(C++20まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>true です。

(C++20以降)

目次

[編集] パラメータ

first, last - 検査する要素の範囲を定義するイテレータのペア
policy - 使用する 実行ポリシー
p - 範囲の先頭に見つかることを期待される要素に対してtrueを返す単項述語。

p(v) という式は、(おそらくconstな) VT 型の全ての引数 v に対して bool に変換可能でなければなりません。ここで VTInputIt の値型であり、値カテゴリに関わらず、v を変更してはなりません。したがって、VT& のパラメータ型は許可されません。また、VT の移動がコピーと同等でない限り、VT も許可されません(C++11以降)。​

型要件
-
InputItLegacyInputIterator の要件を満たす必要があります。
-
ForwardItLegacyForwardIterator の要件を満たし、その値型は UnaryPred のパラメータ型に変換可能でなければなりません。
-
UnaryPredPredicate の要件を満たさなければなりません。

[編集] 戻り値

[firstlast) の要素 e が式 p(e) に関して分割されている場合、true。そうでない場合、false

[編集] 計算量

p の適用回数は最大で std::distance(first, last)

[編集] 例外

テンプレートパラメータ ExecutionPolicy を持つオーバーロードは、次のようにエラーを報告します。

  • アルゴリズムの一部として呼び出された関数の実行が例外をスローし、ExecutionPolicy標準ポリシー のいずれかである場合、std::terminate が呼び出されます。その他の ExecutionPolicy の場合、動作は実装定義です。
  • アルゴリズムがメモリの割り当てに失敗した場合、std::bad_alloc がスローされます。

[編集] 可能な実装

template<class InputIt, class UnaryPred>
bool is_partitioned(InputIt first, InputIt last, UnaryPred p)
{
    for (; first != last; ++first)
        if (!p(*first))
            break;
    for (; first != last; ++first)
        if (p(*first))
            return false;
    return true;
}

[編集]

#include <algorithm>
#include <array>
#include <iostream>
 
int main()
{
    std::array<int, 9> v {1, 2, 3, 4, 5, 6, 7, 8, 9};
 
    auto is_even = [](int i) { return i % 2 == 0; };
    std::cout.setf(std::ios_base::boolalpha);
    std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
 
    std::partition(v.begin(), v.end(), is_even);
    std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
 
    std::reverse(v.begin(), v.end());
    std::cout << std::is_partitioned(v.cbegin(), v.cend(), is_even) << ' ';
    std::cout << std::is_partitioned(v.crbegin(), v.crend(), is_even) << '\n';
}

出力

false true false true

[編集] 関連項目

要素の範囲を2つのグループに分割する
(関数テンプレート) [編集]
パーティション化された範囲のパーティションポイントを見つける
(関数テンプレート) [編集]
範囲が指定された述語によってパーティション化されているかどうかを判断する
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)