В чем разница между std ::lower_bound и std ::upper_bound?

#c

#c

Вопрос:

Приведенный ниже код не компилируется как с MSVC2017, так и с GCC11:

 #include <deque>
#include <chrono>
#include <algorithm>

using Clock = std::chrono::system_clock;
using TimePoint = std::chrono::time_point<Clock>;

struct PricePoint
{
    TimePoint dt;
    double buy;
    double sell;
};

inline bool operator < (const TimePoint amp; dt, const PricePoint amp; a)
{
    return a.dt < dt;
}

int main()
{
    std::deque<PricePoint> priceSequence;
    const auto begin = std::lower_bound(priceSequence.begin(), priceSequence.end(), Clock::now());
    return 0;
}
  

Но если я заменю std::lower_bound на std::upper_bound него, он начнет компилироваться. В чем разница?

Ответ №1:

ошибка: нет совпадения для ‘operator<‘

Такого рода ошибки предполагают, что какой-то код шаблона пытается использовать оператор, который вы не определили.

lower_bound и upper_bound делайте противоположные сравнения. < (const TimePoint amp; dt, const PricePoint amp; a) подходит для upper_bound , но lower_bound требует, чтобы вы определили это:

 inline bool operator < (const PricePoint amp; a, const TimePoint amp; dt)
{
    return dt < a.dt;
}