名前空間
変種
操作

std::experimental::ranges::adjacent_find

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
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) 範囲 [firstlast) で、隣接する2つの等しい要素を検索します。要素は proj で射影された後、pred を用いて比較されます。
2) (1) と同じですが、ソース範囲として r を使用し、ranges::begin(r)firstranges::end(r)last として使用するかのようです。

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

目次

[edit] パラメータ

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

[edit] 戻り値

最初に見つかった隣接する等しい要素のペアの最初の要素へのイテレータ。すなわち、ii + 1 の両方が範囲 [firstlast) にあり、かつ ranges::invoke(pred, ranges::invoke(proj, *i), ranges::invoke(proj, *(i + 1))) != false を満たす最初のイテレータ i

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

[edit] 計算量

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

[edit] 実装例

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;
}

[edit]

[edit] 関連項目

等しい(または指定された述語を満たす)最初の2つの隣接する項目を見つける
(関数テンプレート) [編集]
範囲内の連続する重複要素を削除する
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)