Замена std ::find_if и std::bind2nd в отсортированном векторе

#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 дня. Хотя спасибо