为什么条件不是* First1 == * First2 ?? (C ++ STL包括功能工具)

时间:2019-04-24 06:59:06

标签: c++ algorithm stl

我是一名学习STL C ++的学生,并且有一个简单的问题。

我想知道在学习如何在算法库中实现包含函数。看到这个代码 (此代码来自https://en.cppreference.com/w/cpp/algorithm/includes

template<class InputIt1, class InputIt2> 
bool includes(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) {
    for (; first2 != last2; ++first1) {
        if (first1 == last1 || *first2 < *first1)
            return false;
        if ( !(*first1 < *first2) )
            ++first2;
    }
    return true;
}

本节中有问题。

if ( !(*first1 < *first2) )
            ++first2;

此部分显示为代码,该代码确定*first1是否等于*first2以确定给定的部分序列是否为有序序列的一部分。我想。

如果是这样,*first1 == * first2似乎足够了,我想知道为什么!(first1 < first2)

这种情况有什么特殊原因吗?

2 个答案:

答案 0 :(得分:4)

类型InputIt1要求的概念之一是它实现了<运算符。 (如果允许表达式,则其他比较器==!=<=>=>都可以用<来表示与!否定,尽管正式替换==称为 equivalence 。)

C ++标准库函数因此根据<编写条件检查。

参考:https://en.cppreference.com/w/cpp/named_req/LessThanComparable

答案 1 :(得分:2)

要求平等是不必要的强条件; strict weak ordering(其中< must be)就足够了。

请注意,!(*first2 < *first1)暗示了先前的条件为假,因此当first2*first1根据顺序相等时,*first2会递增。