【发布时间】:2021-11-16 19:13:52
【问题描述】:
我有来自https://en.cppreference.com/w/cpp/algorithm/includes的算法std::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 递增的唯一条件是*first1 == *first2 那么为什么使用小于< 以及否定运算符! 运算符而不是像我的实现中那样直接使用等于运算符==?
- 这仅仅是为了某种可读性和兼容性吗?
- 我的分析正确吗?谢谢!
【问题讨论】:
-
因为大多数标准算法和标准包含使用小于比较进行比较(和排序)。因此,最小意外原则适用。正如您在问题中所指出的,相等可以从小于合成。另见C++ named requirements: Compare