我std::includes
从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 statement
循环中的第二个使用小于运算符<
而不是相等运算符==
?
这是我的类似实现:
template<class InputIt1, class InputIt2>
bool including(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2){
while (first2 != last2){
if (first1 == last1 || *first2 < *first1)
return false;
if ( *first1 == *first2 )
++first2;
++first1;
}
return true;
}
int main(){
std::vector<int> v{1, 5, 7, 23, 24, 57, 77};
// std::sort(v.begin(), v.end());
int a[]{7, 24};
std::cout << including(v.begin(), v.end(), a, a + 2) << '\n'; // 1
std::cout << std::includes(v.begin(), v.end(), a, a + 2) << '\n'; // 1
}
所以我得出了这样的结论:
第一个条件:*first2 < *first1
-> 返回 false。
第二个条件:!(*first1 < *firs2)
->*first1 >= *first2
所以*first1 > *first2
导致算法返回false
并*first1 >= *first2
导致firsts2
增加,所以唯一的条件first2
增加是 when*first1 == *first2
那么为什么将小于<
与否定运算!
符运算符一起使用,而不是==
像在我的实现中那样直接使用等于运算符?
该算法正在排序范围内工作。您需要一个<
关系来对一系列元素进行排序,但不一定是一个==
关系,因此使用<
限制较少并且更通用。
还要考虑到大多数算法和容器使用<
而不是==
比较元素。见例如std::map
:
在标准库使用比较要求的任何地方,唯一性都是通过使用等价关系确定的。用不精确的术语来说,如果两个对象 a 和 b 的比较小于另一个,则认为它们是等效的(不是唯一的):!comp(a, b) && !comp(b, a)。
当!comp(a,b) && !comp(b,a)
. 大多数情况下,这与 相同a == b
,但不一定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句