Ваш пример сломан в нескольких тривиальных способах: класс Container
должен быть определен до того FooAccDateComp
для того, чтобы использовать его там, вы должны сделать myDate
общественного члена Container
, доступ к этому члену в методе сравнения с использованием , а не ->myDate
, и, наконец, решить, назовите ваш вектор mystuff
или events
, но не смешайте оба. Я полагаю, что были сделаны соответствующие исправления.
Вы должны были определить свою функцию сравнения, чтобы принять в качестве первого аргумента параметр Date
и параметр Container
как второй; напротив того, что вы сделали. Или вы можете использовать std::lower_bound
вместо std::upper_bound
, если это вам подойдет (поскольку вы не говорите, что вы собираетесь делать с index
, это трудно сказать), так как выбор, сделанный в вопросе, адаптирован к этому. Вопреки тому, что в настоящее время принятый ответ говорит, что вам не нужны оба, если вы используете только std::upper_bound
или только std::lower_bound
(хотя вам понадобятся и то, и другое, если используете std::equal_range
, либо при использовании как std::upper_bound
, так и std::lower_bound
).
Вы можете найти их на первый взгляд немного странные спецификации в стандарте, но есть способ понять, не глядя, почему они должны быть такими.При использовании lower_bound
вы хотите найти точку, которая отделяет записи Container
, которые (строго) меньше, чем ваши данные Date
от тех, которые не являются, и для этого требуется вызвать функцию сравнения с аргументом во второй позиции. Если, однако, вы запрашиваете upper_bound
(как и вы), вы хотите найти точку, которая отделяет записи не строго больше, чем ваши данные Date
от тех, которые есть, и для этого требуется вызвать функцию сравнения с этим аргументом Date
в первой позиции (и отрицает возвращаемый логический результат). А для equal_range
вам, разумеется, нужны обе возможности.
Измените upper_bound на find_if, и он должен работать нормально. Тем не менее, почему вы не используете карту здесь? –
@Billy: отсортированный вектор может быть быстрее карты, если вы не меняете его очень часто. –
@Billy: сложности различны, 'upper_bound' - O (log N), а' find_if' - O (N). –