名前空間
変種
操作

std::experimental::ranges::search

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
template< ForwardIterator I1, Sentinel<I1> S1,

          ForwardIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>,
          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
I1 search( I1 first1, S1 last1, I2 first2, S2 last2,

           Pred pred = Pred{}, Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(1) (ranges TS)
template< ForwardRange R1, ForwardRange R2, class Pred = ranges::equal_to<>,

          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires IndirectlyComparable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                                  Pred, Proj1, Proj2>
ranges::safe_iterator_t<R1> search( R1&& r1, R2&& r2, Pred pred = Pred{},

                                    Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(2) (ranges TS)
1) シーケンス [first2last2) の最初の出現を、範囲 [first1last1) の中で検索します。要素は、それぞれ pred、proj2、proj1 で射影された後に比較されます。
2) (1) と同じですが、最初のソース範囲として r1、2番目のソース範囲として r2 を使用します。これは、ranges::begin(r1) を first1、ranges::end(r1) を last1、ranges::begin(r2) を first2、そして ranges::end(r2) を last2 として使用するのと同等です。

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

目次

[編集] パラメータ

first1, last1 - 調査する要素の範囲
r1 - 調査する要素の範囲
first2, last2 - 検索対象の要素の範囲
r2 - 検索対象の要素の範囲
pred - 射影された要素に適用する述語
proj1 - 最初の範囲の要素に適用する射影
proj2 - 2番目の範囲の要素に適用する射影

[編集] 戻り値

範囲 [first1last1) の中でシーケンス [first2last2) の最初の出現の開始位置を指すイテレータ。シーケンス [first2last2) が空の場合、first1 が返されます。そのような出現が見つからなかった場合、last1 と等価なイテレータが返されます。

[編集] 計算量

述語および各射影の適用回数は、最大で S * N 回です。ここで、S = last2 - first2N = last1 - first1 です。

[編集] 実装例

template<ForwardIterator I1, Sentinel<I1> S1,
         ForwardIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>,
         class Proj1 = ranges::identity, class Proj2 = ranges::identity>
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
I1 search(I1 first1, S1 last1, I2 first2, S2 last2,
          Pred pred = Pred{}, Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{})
{
    for (; ; ++first1)
    {
        I1 it = first1;
        for (I2 it2 = first2; ; (void)++it, (void)++it2)
        {
            if (it2 == last2)
                return first1;
            if (it == last1)
                return it;
            if (!ranges::invoke(pred, ranges::invoke(proj1, *it),
                                      ranges::invoke(proj2, *it2)))
                break;
        }
    }
}

[編集]

[編集] 関連項目

要素の範囲の最初の出現を検索する
(関数テンプレート) [編集]
特定の範囲内で最後の要素のシーケンスを見つける
(function template) [編集]
一方のセットがもう一方のサブセットであるかどうかを true で返します。
(function template) [編集]
2つの要素の集合が同じかどうかを判断する
(function template) [編集]
特定の基準を満たす最初の要素を見つける
(function template) [編集]
ある範囲が別の範囲より辞書順で小さい場合に true を返す
(function template) [編集]
2つの範囲が異なる最初の位置を見つける
(function template) [編集]
範囲内の要素の連続したコピーを検索します。
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)