Namespaces
Variants

std::experimental::ranges:: equal

From cppreference.net
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) 相同,区别在于当第一个范围耗尽或检测到第一个不匹配时即认为第二个范围结束。等价于 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

两个范围被视为相等,当且仅当它们具有相同数量的元素,并且对于范围 [ first1 , last1 ) 中的每个迭代器 i ranges:: invoke ( pred, ranges:: invoke ( proj1, * i ) , ranges:: invoke ( proj2, * ( first2 + ( i - first1 ) ) ) ) 的结果为 true

尽管存在上述声明,算法声明的实际模板参数数量和顺序是未指定的。因此,若在调用算法时使用了显式模板参数,该程序很可能不具备可移植性。

目录

参数

first1, last1 - 元素的第一范围
r1 - 元素的第一范围
first2, last2 - 元素的第二范围
r2 - 元素的第二范围
first2_ - 元素第二范围的起始位置
pred - 应用于投影元素的谓词
proj1 - 应用于第一范围元素的投影
proj2 - 应用于第二范围元素的投影

返回值

true 如果两个范围相等,否则返回 false

注释

ranges::equal 不应用于比较由 std::unordered_set std::unordered_multiset std::unordered_map std::unordered_multimap 的迭代器形成的范围,因为即使两个容器存储相同的元素,这些容器中元素的存储顺序也可能不同。

在比较整个容器是否相等时,通常推荐使用对应容器的 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;
}

示例

参见

判断两组元素是否相同
(函数模板)
查找首个满足特定条件的元素
(函数模板)
若一个范围按字典序小于另一个范围则返回 true
(函数模板)
查找两个范围首次出现差异的位置
(函数模板)
搜索一个元素范围
(函数模板)