c++中比较器的上界和下界是如何工作的



我只是想知道C++标准库中的lower_bound和upper_bound函数是如何使用比较器工作的。使用cppreference.com上提供的文档,我无法理解它们是如何实际工作的。例如

vector<int> arr = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5};
auto it1 = lower_bound(arr.begin(), arr.end(), 3, less<int>());
auto it2 = lower_bound(arr.begin(), arr.end(), 3, less_equal<int>());
auto it3 = lower_bound(arr.begin(), arr.end(), 3, greater<int>());
auto it4 = lower_bound(arr.begin(), arr.end(), 3, greater_equal<int>());
auto it5 = lower_bound(arr.begin(), arr.end(), 3, equal_to<int>());
auto it6 = lower_bound(arr.begin(), arr.end(), 3, not_equal_to<int>());
// Output in comments
cout << it1 - arr.begin() << endl;      // 4
cout << it2 - arr.begin() << endl;      // 6
cout << it3 - arr.begin() << endl;      // 0
cout << it4 - arr.begin() << endl;      // 10
cout << it5 - arr.begin() << endl;      // 6
cout << it6 - arr.begin() << endl;      // 4
auto it7 = upper_bound(arr.begin(), arr.end(), 3, less<int>());
auto it8 = upper_bound(arr.begin(), arr.end(), 3, less_equal<int>());
auto it9 = upper_bound(arr.begin(), arr.end(), 3, greater<int>());
auto it10 = upper_bound(arr.begin(), arr.end(), 3, greater_equal<int>());
auto it11 = upper_bound(arr.begin(), arr.end(), 3, equal_to<int>());
auto it12 = upper_bound(arr.begin(), arr.end(), 3, not_equal_to<int>());
cout << it7 - arr.begin() << endl;      // 6
cout << it8 - arr.begin() << endl;      // 4
cout << it9 - arr.begin() << endl;      // 10
cout << it10 - arr.begin() << endl;     // 0
cout << it11 - arr.begin() << endl;     // 4
cout << it12 - arr.begin() << endl;     // 6

对于下限,他们使用:(*it < val) [ (comp(*it, val)) for comparator]
对于上限,他们使用(!(val < *it)) [ (!comp(val, *it)) for comparator) ]

有人能解释他们使用比较器来获得所有期望输出的工作吗?

std::lower_bound要求输入范围相对于比较器进行分区,即comp(element, value)返回true的所有元素都必须位于返回false的元素之前。在您的示例中,只有使用lessless_equal的调用才能满足此要求;其他调用表现出未定义的行为。

std::upper_bound要求输入范围相对于表达式!comp(value, element)进行划分——同样,它返回true的所有元素都必须在它返回false的元素之前。在您的示例中,只有使用lessless_equal的调用才能满足此要求;其他调用表现出未定义的行为。

涉及lessless_equal的调用行为符合文档记录,并产生预期结果。

相关内容

  • 没有找到相关文章

最新更新