The purpose of lower_bound
is to find the position where an element would go. So you have to specify that element. If you only want to sort by the second partner, then you just need to specify a value for that:
std::vector<std::pair<int, double>> vec = /* populate */ ; // must be sorted!
double target = 1.3;
auto it = std::lower_bound(vec.begin(), vec.end(), target,
[](std::pair<int, double> const & x, double d)
{ return x.second < d; });
Note that the vector must be sorted according to the same predicate, though, so you might want to store the predicates more permanently:
auto lb_cmp = [](std::pair<int, double> const & x, double d) -> bool
{ return x.second < d; };
auto sort_cmp = [](std::pair<int, double> const & x,
std::pair<int, double> const & y) -> bool
{ return x.second < y.second; };
std::sort(vec.begin(), vec.end(), sort_cmp);
auto it = std::lower_bound(vec.begin(), vec.end(), target, lb_cmp);