upper / lower_bound错误比较函数参数顺序

时间:2016-09-24 13:06:45

标签: c++ stl upperbound

cpprefernce说:

template< class ForwardIt, class T, class Compare > ForwardIt
upper_bound( ForwardIt first, ForwardIt last, const T& value, compare comp );
     

(...)

     

comp - 比较函数对象(即满足该对象的对象)   比较的要求)如果第一个参数是,则返回​true   不到第二个。比较函数的签名应该   相当于以下内容:

bool cmp(const Type1 &a, const Type2 &b);
     

(...)类型Type1必须是这样的   类型T的对象可以隐式转换为Type1。该   类型Type2必须是ForwardIt类型的对象   取消引用,然后隐式转换为Type2

拥有以下代码:

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

struct employee {
  string first;
  string last;
};

int main() {
  vector<employee> v = { {"John", "Smith"} };

  sort(v.begin(), v.end(),
       [](const employee& e1, const employee& e2) { return e1.last < e2.last; });

  auto p = lower_bound(v.begin(), v.end(), "Smith",
                       [](const employee& e, const string& y) { return e.last < y; });
}

和来自cppreference的可能的实现

template<class ForwardIt, class T, class Compare>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp)
{
    ForwardIt it;
    typename std::iterator_traits<ForwardIt>::difference_type count, step;
    count = std::distance(first,last);

    while (count > 0) {
        it = first; 
        step = count / 2;
        std::advance(it, step);
        if (!comp(value, *it)) {
            first = ++it;
            count -= step + 1;
        } else count = step;
    }
    return first;
}

传递给lower_bound调用的lambda中的参数顺序应该反转,因为valueconst std::string&并且它作为第一个参数传递给comp,但它像这样编译并在传递不同的情况下给出编译错误。

我在这里缺少什么?

0 个答案:

没有答案