名前空間
変種
操作

std::experimental::ranges::equal

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

          class Pred = ranges::equal_to<>,
          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
bool equal( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = Pred{},

            Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(1) (ranges TS)
template< InputRange R1, InputRange 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>
bool equal( R1&& r1, R2&& r2, Pred pred = Pred{},

            Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(2) (ranges TS)
template< InputIterator I1, Sentinel<I1> S1, class I2,

          class Pred = ranges::equal_to<>,
          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires InputIterator<std::decay_t<I2>> && !Range<I2> &&
             IndirectlyComparable<I1, std::decay_t<I2>, Pred, Proj1, Proj2>
bool equal( I1 first1, S1 last1, I2&& first2_, Pred pred = Pred{},

            Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(3) (ranges TS)
(非推奨)
template< InputRange R1, class I2, class Pred = ranges::equal_to<>,

          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires InputIterator<std::decay_t<I2>> && !Range<I2> &&
             IndirectlyComparable<ranges::iterator_t<R1>, std::decay_t<I2>, Pred, Proj1, Proj2>
bool equal( R1&& r1, I2&& first2_, Pred pred = Pred{},

            Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(4) (ranges TS)
(非推奨)
1) range [first1last1) が range [first2last2) と等しい場合は true を返し、そうでない場合は false を返します。
2) (1) と同じですが、r1 を最初のソース範囲、r2 を 2 番目のソース範囲として使用します。これは、ranges::begin(r1)first1ranges::end(r1)last1ranges::begin(r2)first2ranges::end(r2)last2 として使用するのと同等です。
3) (1) と同じですが、2 番目の範囲は、最初の範囲が枯渇したとき、または最初の不一致が検出されたときに終了すると見なされます。これは、return last1 == ranges::mismatch(first1, last1, std::forward<I2>(first2_), comp, proj1, proj2).in1(); と同等です。
4) (3) と同じですが、r1 を最初のソース範囲として使用します。これは、ranges::begin(r1)first1ranges::end(r1)last1 として使用するのと同等です。

2 つの範囲は、要素数が同じであり、範囲 [first1last1) 内のすべてのイテレータ i について、ranges::invoke(pred, ranges::invoke(proj1, *i), ranges::invoke(proj2, *(first2 + (i - first1))))true である場合に等しいと見なされます。

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

目次

[編集] パラメータ

first1, last1 - 要素の最初の範囲
r1 - 要素の最初の範囲
first2, last2 - 要素の 2 番目の範囲
r2 - 要素の 2 番目の範囲
first2_ - 要素の 2 番目の範囲の開始位置
pred - 射影された要素に適用する述語
proj1 - 最初の範囲の要素に適用する射影
proj2 - 2番目の範囲の要素に適用する射影

[編集] 戻り値

2 つの範囲が等しい場合は true を返し、それ以外の場合は false を返します。

[編集] 注記

ranges::equal は、std::unordered_setstd::unordered_multisetstd::unordered_map、または std::unordered_multimap のイテレータによって形成される範囲を比較するために使用すべきではありません。これらのコンテナに格納されている要素の順序は、2 つのコンテナが同じ要素を格納している場合でも異なる可能性があるためです。

コンテナ全体を等価性で比較する場合、通常は対応するコンテナの operator== を使用することが推奨されます。

[編集] 計算量

1,2) SizedSentinel<S1, I1> && SizedSentinel<S2, I2> が満たされ、かつ last1 - first1 != last2 - first2 である場合、述語と射影の適用はありません。それ以外の場合は、最大で min(last1 - first1, last2 - first2) 回の述語と各射影の適用が行われます。
3,4) 最大で last1 - first1 回の述語と各射影の適用が行われます。

[編集] 実装例

namespace detail 
{
    template<InputIterator I1, SizedSentinel<I1> S1,
             InputIterator I2, SizedSentinel<I1> S2>
    bool check_size(I1& first1, S1& last1, I2& first2, S2& last2)
    {
        return last1 - first1 != last2 - first2;
    }
 
    template<InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I1> S2>
    bool check_size(I1& first1, S1& last1, I2& first2, S2& last2)
    {
        return false;
    }
}
 
template<InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I2> S2,
         class Pred = ranges::equal_to<>, 
         class Proj1 = ranges::identity, class Proj2 = ranges::identity>
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
bool equal(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = Pred{},
           Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{}) 
{
    if (detail::check_size(first1, last1, first2, last2))
        return false;
    for (; first1 != last1 && first2 != last2; (void) ++first1, (void)++first2)
        if (!ranges::invoke(pred, ranges::invoke(proj1, *first1), 
                                  ranges::invoke(proj2, *first2)))
            return false;
    return first1 == last1 && first2 == last2;
}

[編集]

[編集] 関連項目

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