Пользовательский компаратор в lower_bound () STL - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь понять, как работают компараторы в функциях lower_bound, и я наткнулся на этот пример:

#include <vector>  
#include <algorithm>  

using namespace std;  

bool ignore_case(char a, char b) {  
   return(tolower(a) == tolower(b));  
}  

int main(void) {  
   vector<char> v = {'A', 'b', 'C', 'd', 'E'};  
   auto it = lower_bound(v.begin(), v.end(), 'C');  

   cout << "First element which is greater than \'C\' is " << *it << endl;  

   it = lower_bound(v.begin(), v.end(), 'C', ignore_case);  

   cout << "First element which is greater than \'C\' is " << *it << endl;  

   it = lower_bound(v.begin(), v.end(), 'z', ignore_case);  

   cout << "All elements are less than \'z\'." << endl;  

   return 0;  
}  

Вывод следующего кода:

First element which is greater than 'C' is b
First element which is greater than 'C' is d
All elements are less than 'z'.

Как пользовательский компаратор проверки на равенство работы? Я думал, что это вернет истину, если а должен быть до б и ложь, если наоборот. Как это работает в функциях lower_bound (), где предполагается получить ПЕРВОЕ значение, которое больше, чем равен нашему заданному ключу.

1 Ответ

2 голосов
/ 27 апреля 2020

В этом примере неправильно используется std::lower_bound. Если comp - используемый компаратор, а value - искомое значение, все элементы, для которых comp(element, value) == true должны быть перед всеми элементами, для которых comp(element, value) == false в диапазоне. Это не относится ни к одному из показанных вызовов.

Кроме того, предполагается, что компаратор возвращает true, если первый аргумент меньше второго аргумента, а показанная функция возвращает true, если первый элемент равно второму аргументу. Само по себе это строго не запрещено, но, скорее всего, не даст ожидаемых результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...