Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Что такое компаратор?

#cpp


В вопросе Поиск самой длинной строки я увидел слово компаратор, но поскольку я мало
понимаю в программировании, то я не знаю что это может быть. Объясните, пожалуйста.
    


Ответы

Ответ 1



Ну, например, как выполняется сортировка? sort(v.begin(),v.end()); При этом сортируемые элементы сравниваются просто с помощью оператора <. Вот он и есть компаратор по умолчанию. Но если вы хотите какую-то очень хитрую сортировку, то это делается так sort(v.begin(),v.end(), comp); где comp и есть компаратор - т.е. функция, функциональный объект, лямбда-выражение - словом, которому можно передать два элемента для сравнения. Например, по умолчанию сортировка строк будет сравнивать их содержимое. А сортировка sort(v.begin(),v.end(), // Вот это лямбда-выражение и есть компаратор: [](const string& a, const string& b){ return a.length() < b.length(); ); будет сортировать строки по длине. То же самое можно записать и с обычной функцией: // Здесь компаратор - функция comp: bool comp(const string& a, const string& b) { return a.length() < b.length(); } sort(v.begin(),v.end(), comp);

Ответ 2



Компаратор - это специальная функция, которая умеет сравнивать два объекта и решить, больше-меньше-равно. Зачем это нужно? Представьте себе, что нужно написать сортировку массива объектов. Нужно будет для каждого нового типа объектов писать свою сортировку (ведь функция сортировки должна уметь сравнивать два объекта). Поэтому, решили, что в сортировку можно передать функцию, которая умеет сделать сравнение, а функция сортировки стает универсальной. Тут же появляется дополнительная возможность - можно менять функции сортировки, можно искать по массиву, разделять на части. Сами компараторы бывают двух основных типов. Первый тип - это компаратор, который возвращает bool. Например, std::less. У этого способа есть одна большущая проблема. Если a > b и b > a, то некоторые функции с++ считают, что a==b. Но это не всегда так. Второй тип - это такой компаратор, который возвращает -1, 0 и +1 (либо вообще весь диапазон целых). Суть проста - 0 - равно, -1 - первое больше, +1 - второе больше. Пример - strcpm. Только здесь пошли ещё дальше - если число не ноль, то оно не просто показывает позицию первого отличающегося символа. Удобно. Сейчас Саттер придумал (а точнее, подсмотрел в Perl) оператор космический корабль (<=>). Этот оператор работает по второй схеме и решает кучу проблем компаратора первого типа. Детали в предложении.

Ответ 3



Слово компаратор происходит от английского "compare", то есть "сравнивать". Это могут быть как электронные схемы, так и программы, фрагменты кода, функции. Так как мы говорим о С++, то в данном случае это будет код. В С++ хоть и можно сравнивать строки напрямую, но это не всегда удобно. К примеру, если мы сравниваем длину строк, то это будет выглядеть так: string a, b; getline (cin, a); getline (cin, b); if (a.length () == b.length ()) { cout << "YES"; } Это не очень удобно. Для этого и нужен компаратор - одной функцией сравнить необходимые параметры строки. Очень удобно для сортировки! Компараторы имеются в стандартных библиотеках С++, а можно и написать свой.

Комментариев нет:

Отправить комментарий