Namespaces
Variants

std::experimental::ranges:: count, std::experimental::ranges:: count_if

From cppreference.net
**翻訳結果:** HTMLタグ、属性、` `、`
`、``タグ内のテキスト、およびC++固有の用語は翻訳せず、元のフォーマットを保持します。
このC++コードテンプレートは範囲TS(Technical Specification)の一部であり、指定された範囲内で特定の値と等しい要素の数をカウントする関数テンプレートを定義しています。
HTMLタグ、属性、コードブロック内のテキスト、C++固有の用語はすべて原文のまま保持されています。テンプレート宣言と関数シグネチャは翻訳対象外のコード部分として扱われています。 (注:このHTML要素には翻訳対象のテキストコンテンツが含まれていないため、元の構造をそのまま保持しています)
template < InputIterator I, Sentinel < I > S, class T, class Proj = ranges:: identity >

requires IndirectRelation < ranges:: equal_to <> , projected < I, Proj > , const T * >

ranges :: difference_type_t < I > count ( I first, S last, const T & value, Proj proj = Proj { } ) ;
(1) (ranges TS)
template < InputRange R, class T, class Proj = ranges:: identity >

requires IndirectRelation < ranges:: equal_to <> ,
projected < ranges:: iterator_t < R > , Proj > , const T * >
ranges :: difference_type_t < ranges:: iterator_t < R >>

count ( R && r, const T & value, Proj proj = Proj { } ) ;
(2) (ranges TS)
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < I, Proj >> Pred >

ranges :: difference_type_t < I > count_if ( I first, S last, Pred pred, Proj proj = Proj { } ) ;
(3) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < ranges:: iterator_t < R > , Proj >> Pred >
ranges :: difference_type_t < ranges:: iterator_t < R >>

count_if ( R && r, Pred pred, Proj proj = Proj { } ) ;
(4) (ranges TS)

範囲 [ first , last ) 内の特定の条件を満たす要素の数を返します。

1) 射影された値が value と等しい要素を数える(つまり、 ranges:: invoke ( proj, * i ) == value の場合)。
3) 射影された値が述語 pred を満たす要素を数える (すなわち、 ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) ) ! = false )。
2,4) (1,3) と同じですが、 r をソース範囲として使用します。これは ranges:: begin ( r ) first として、 ranges:: end ( r ) last として使用する場合と同様です。

上記に示された宣言にかかわらず、アルゴリズム宣言の実際のテンプレートパラメータの数と順序は未規定です。したがって、アルゴリズムを呼び出す際に明示的なテンプレート引数を使用する場合、プログラムはおそらく移植性がありません。

目次

パラメータ

first, last - 検査対象の要素範囲
r - 検査対象の要素範囲
value - 検索する値
pred - 投影された要素に適用する述語
proj - 要素に適用する投影

戻り値

条件を満たす要素の数。

計算量

正確に last - first 回の述語の比較/適用、および同数の射影の適用が行われます。

注記

範囲内の要素数について、 [ first , last ) の追加条件なしの場合、 ranges::distance を参照してください。

実装例

第一バージョン
template<InputIterator I, Sentinel<I> S, class T, class Proj = ranges::identity>
    requires IndirectRelation<ranges::equal_to<>, projected<I, Proj>, const T*>
ranges::difference_type_t<I> count(I first, S last, const T& value, Proj proj = Proj{})
{
    ranges::difference_type_t<I> ret = 0;
    for (; first != last; ++first)
        if (ranges::invoke(proj, *first) == value)
            ++ret;
    return ret;
}
第二バージョン
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryPredicate<projected<I, Proj>> Pred>
ranges::difference_type_t<I> count_if(I first, S last, Pred pred, Proj proj = Proj{})
{
    ranges::difference_type_t<I> ret = 0;
    for (; first != last; ++first)
        if (ranges::invoke(pred, ranges::invoke(proj, *i)))
            ++ret;
    return ret;
}

関連項目

特定の条件を満たす要素の数を返す
(関数テンプレート)
イテレータとセンチネル間、または範囲の先頭と終端間の距離を返す
(関数テンプレート)