std::vector::at
does not return an iterator, which is what you need for upper_bound
. You can obtain an iterator to the required position and pass it like this:
up = upper_bound(v.begin() + i, v.end(), Number, cmp);
or
up = upper_bound(std::next(v.begin(), i), v.end(), Number, cmp);