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
вызов должен быть отменен, так как value
это const std::string&
и это передано comp
в качестве первого параметра, но он компилируется следующим образом и выдает ошибку компиляции, если передается иначе.
Что мне здесь не хватает?
Задача ещё не решена.
Других решений пока нет …