#c
#c
Вопрос:
У меня есть класс date GregorianDate
и std::vector<GregorianDate>
экземпляр dates
. Этот вектор отсортирован.
В настоящее время, учитывая GregorianDate
экземпляр date
, у меня есть выражение
std::vector<GregorianDate>::const_iterator it = std::find_if(
dates.begin(),
dates.end(),
std::bind2nd(std::greater<GregorianDate>(), date)
);
Я очень хочу заменить это на
std::vector<GregorianDate>::const_iterator it =
std::lower_bound(dates.begin(), dates.end(), date);
поскольку bind2nd
он устарел и dates
сортируется.
Являются ли результаты двух выражений идентичными для любого date
?
Комментарии:
1. Вы могли бы продолжать использовать
std::find_if
, но перейтиstd::bind2nd
на лямбда-выражение.
Ответ №1:
Результаты не совпадают. std::lower_bound
дает вам первый элемент в наборе, который больше или равен элементу, который вы ищете, или последний, если таковых нет. std::find_if
с другой стороны, будет возвращать только тот элемент, для которого компаратор возвращает true, и std::greater
не будет возвращать true, если элементы равны.
Вам нужно будет использовать std::upper_bound
для сопоставления вашего вызова с find_if
( upper_bound
возвращает первый элемент, больший, чем элемент, который вы ищете), или изменить свой компаратор в find_if
соответствии с тем, как lower_bound
работает.
Комментарии:
1. Таким образом, результат будет точно таким же для любой даты, если я использую std::upper_bound(dates.begin(), dates.end(), date);?
2. @SasidiranSangamanautram Да.
upper_bound
точно соответствует тому, что делает ваш вызовfind_if
.3. Это действительно полезно. Спасибо.
4. Давайте купим вам эту футболку, кружку и ручку к Пасхе!
5. @Bathsheba Я бы хотел. У меня как минимум 4 дня. Хотя спасибо