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中的参数顺序应该反转,因为value
是const std::string&
并且它作为第一个参数传递给comp
,但它像这样编译并在传递不同的情况下给出编译错误。
我在这里缺少什么?