Namespaces
Variants

std::experimental::ranges:: mismatch

From cppreference.net
template < InputIterator I1, Sentinel < I1 > S1, InputIterator I2, Sentinel < I2 > S2,

class Proj1 = ranges:: identity , class Proj2 = ranges:: identity ,
class Pred = ranges:: equal_to <> >
requires IndirectRelation < Pred, projected < I1, Proj1 > , projected < I2, Proj2 >>
auto mismatch ( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = Pred { } ,
Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } )

- > ranges:: tagged_pair < tag:: in1 ( I1 ) , tag:: in2 ( I2 ) > ;
(1) (ranges TS)
template < InputRange R1, InputRange R2,

class Proj1 = ranges:: identity , class Proj2 = ranges:: identity ,
class Pred = ranges:: equal_to <> >
requires IndirectRelation < Pred, projected < ranges:: iterator_t < R1 > , Proj1 > ,
projected < ranges:: iterator_t < R2 > , Proj2 >>
auto mismatch ( R1 && r1, R2 && r2, Pred pred = Pred { } ,
Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } )
- > ranges:: tagged_pair < tag:: in1 ( ranges:: safe_iterator_t < R1 > ) ,

tag:: in2 ( ranges:: safe_iterator_t < R2 > ) > ;
(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 > &&
IndirectRelation < Pred, projected < I1, Proj1 > ,
projected < std:: decay_t < I2 > , Proj2 >>
auto mismatch ( I1 first1, S1 last1, I2 && first2_, Pred pred = Pred { } ,
Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } )

- > ranges:: tagged_pair < tag:: in1 ( I1 ) , tag:: in2 ( std:: decay_t < I2 > ) > ;
(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 > &&
IndirectRelation < Pred, projected < ranges:: iterator_t < R1 > , Proj1 > ,
projected < std:: decay_t < I2 > , Proj2 >>
auto mismatch ( R1 && r1, I2 && first2_, Pred pred = Pred { } ,
Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { <span class="br

1) 返回两个范围中首个不匹配的元素对:一个范围由 [ first1 , last1 ) 定义,另一个范围由 [ first2 , last2 ) 定义。
2) (1) 相同,但使用 r1 作为第一源范围, r2 作为第二源范围,如同使用 ranges:: begin ( r1 ) 作为 first1 ranges:: end ( r1 ) 作为 last1 ranges:: begin ( r2 ) 作为 first2 ,以及 ranges:: end ( r2 ) 作为 last2
3) (1) 相同,但行为上视 first2 std:: decay_t < I2 > first2 = std:: forward < I2 > ( first2_ ) ; last2 ranges :: unreachable { }。底层算法递增 first2 的次数永远不会超过 last1 - first1 次。
4) (3) 相同,但使用 r1 作为第一源范围,如同使用 ranges:: begin ( r1 ) 作为 first1 ,并使用 ranges:: end ( r1 ) 作为 last1

元素使用 pred 对两个范围的投影元素进行比较,操作方式类似于 ranges:: invoke ( pred, ranges:: invoke ( proj1, * i ) , ranges:: invoke ( proj2, * j ) )

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

目录

参数

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

返回值

一个包含指向前两个不相等元素的迭代器的 tagged_pair 对象(第一个范围的迭代器具有标签 in1 ,第二个范围的迭代器具有标签 in2 )。

当比较到达 last1 last2 (以先发生者为准)时若未发现不匹配项,则该迭代器对包含结束迭代器及来自另一范围的对应迭代器。

复杂度

最多应用谓词和每个投影 last1 - first1 次。

可能实现

template<InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I2> S2,
         class Proj1 = ranges::identity, class Proj2 = ranges::identity,
         class Pred = ranges::equal_to<>>
    requires IndirectRelation<Pred, projected<I1, Proj1>, projected<I2, Proj2>>
auto mismatch(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = Pred{},
              Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{})
    -> ranges::tagged_pair<tag::in1(I1), tag::in2(I2)>
{
    while (first1 != last1 && first2 != last2 &&
           ranges::invoke(pred, ranges::invoke(proj1, *first1),
                                ranges::invoke(proj2, *first2)))
    {
        ++first1;
        ++first2;
    }
    return {first1, first2};
}

示例

参见

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