Namespaces
Variants

std::experimental::ranges:: equal

From ja.cppreference.net
(注:このHTML要素には翻訳対象のテキストコンテンツが含まれていないため、元の構造をそのまま保持しています)
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) 範囲 [ first1 , last1 ) が範囲 [ first2 , last2 ) と等しい場合 true を返し、それ以外の場合 false を返す。
2) (1) と同様だが、 r1 を第一ソース範囲として、 r2 を第二ソース範囲として使用する。すなわち、 ranges:: begin ( r1 ) を first1 として、 ranges:: end ( r1 ) を last1 として、 ranges:: begin ( r2 ) を first2 として、 ranges:: 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 ) を first1 として、 ranges:: end ( r1 ) を last1 として使用するかのように動作する。

2つの範囲は、同じ数の要素を持ち、範囲 [ first1 , last1 ) 内のすべてのイテレータ 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番目の範囲の要素に適用する投影

戻り値

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

注記

ranges::equal は、 std::unordered_set 、 std::unordered_multiset 、 std::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つの要素集合が同じかどうかを判定する
(関数テンプレート & アルゴリズム関数オブジェクト)
指定された条件を満たす最初の要素を検索する
(関数テンプレート)
一方の範囲が辞書順で他方より小さい場合に true を返す
(関数テンプレート)
2つの範囲が最初に異なる位置を検索する
(関数テンプレート)
ある範囲の要素を検索する
(関数テンプレート)