为什么带有大于比较函数的std :: lower_bound不匹配?

时间:2017-10-20 13:47:48

标签: c++

让我们看看以下代码:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> exmpl = { 2, 3, 6, 9, 134, 1143, 2345 };

    auto LessThan     = [](const int a, const int b) -> bool { return a < b; };
    auto GreaterThan  = [](const int a, const int b) -> bool { return a > b; };

    auto it_reverse_less_than    = std::lower_bound(exmpl.rbegin(), exmpl.rend(), 8, LessThan);
    auto it_reverse_greater_than = std::lower_bound(exmpl.rbegin(), exmpl.rend(), 8, GreaterThan);

    auto it_forward_less_than    = std::lower_bound(exmpl.begin(),  exmpl.end(), 8, LessThan);
    auto it_forward_greater_than = std::lower_bound(exmpl.begin(),  exmpl.end(), 8, GreaterThan);

    std::cout << *it_reverse_less_than << "\n";
    std::cout << *it_reverse_greater_than << "\n";
    std::cout << *it_forward_less_than << "\n";
    std::cout << (it_forward_greater_than == exmpl.end());

    return 0;
}

它提供以下输出:

2345
6
9
1

我使用VC ++编译器检查了结果,并通过Ideone检查了gcc(参见下面的链接),它们是相同的。

我认为it_reverse_greater_than指向1143,因为它是反向迭代器看到的比较函数返回false的第一个元素。我不明白为什么GreaterThan函数在与前向迭代器(it_forward_greater_than指向end())一起使用时不返回匹配项。 it_forward_greater_than不应指向2,因为它是比较函数返回false的第一个元素? it_reverse_greater_than指向最后一个元素,即反向迭代器看到的第一个元素,这不是一个类比的情况吗?

以下是Ideone中的代码: https://ideone.com/0z55ss

0 个答案:

没有答案