Namespaces
Variants

std::experimental::ranges:: adjacent_find

From cppreference.net
ヘッダーで定義 <experimental/ranges/algorithm>
template < ForwardIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectRelation < projected < I, Proj >> Pred = ranges:: equal_to <> >

I adjacent_find ( I first, S last, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class Proj = ranges:: identity ,

IndirectRelation < projected < ranges:: iterator_t < R > , Proj >> Pred = ranges:: equal_to <> >

ranges:: safe_iterator_t < R > adjacent_find ( R && r, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(2) (ranges TS)
1) 範囲 [ first , last ) 内で連続する同一要素を検索します。要素は proj で射影された後、 pred を使用して比較されます。
2) (1) と同じですが、 r をソース範囲として使用します。これは ranges:: begin ( r ) first として、 ranges:: end ( r ) last として使用する場合と同じです。

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

目次

パラメータ

first, last - 検査対象の要素範囲
r - 検査対象の要素範囲
pred - 投影された要素を比較するために使用する述語
proj - 要素に適用する投影

戻り値

同一の要素からなる最初のペアの最初の要素を指すイテレータ、すなわち範囲 [ first , last ) 内にあり、かつ ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) , ranges:: invoke ( proj, * ( i + 1 ) ) ) ! = false が真となる最初のイテレータ i を指す。

そのような要素が見つからない場合、 last と等価と比較されるイテレータが返されます。

計算量

範囲が空でない場合、述語は正確に min((result - first) + 1, (last - first) - 1) 回適用され、ここで result は戻り値であり、射影の適用は最大でその2倍となる。

実装例

template<ForwardIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectRelation<projected<I, Proj>> Pred = ranges::equal_to<>>
I adjacent_find(I first, S last, Pred pred = Pred{}, Proj proj = Proj{})
{
    if (first == last)
        return first;
    I next = first;
    ++next;
    while (next != last)
    {
        if (ranges::invoke(pred, ranges::invoke(proj, *first),
                                 ranges::invoke(proj, *next)))
            return first;
        ++next;
        ++first;
    }
    return next;
}

関連項目

等しい(または与えられた述語を満たす)最初の2つの隣接する要素を検索する
(関数テンプレート)
範囲内の連続する重複要素を削除する
(関数テンプレート)