Не могу разобраться как устроен и работает предикат. Вот простенький пример использования предиката в сортировке:
#include
using namespace std;
bool mySort(int x, int y){ // функция будет использоваться в качестве предиката
return x < y;
}
int main (){
vector
va.push_back(10);
va.push_back(100);
va.push_back(2);
// for (vector
sort(va.begin(), va.end(), mySort); //третий параметр является предикатом
// cout << endl;
// for (vector
return 0;
}
мне непонятно почему обычная функция рассматривается как предикат и почему в фунции-предиката два параметра, а не три к примеру и имеют целый тип параметров
Ответ
std::sort третьим параметром принимает что-то, что можно вызвать как функцию имеющую 2 параметра(полный список требований можно посмотреть тут). Не 3, не 1 — именно 2. Почему 2? Потому что для сортировки, за одну операцию, нужно сравнить именно 2 элемента.
Теперь касательно типа параметров: чтобы корректно сравнить 2 элемента массива, тип параметров функции должен быть совместим с типом элементов массива. Поэтому у Вас в коде и используется int. Но можете использовать и long и любой другой тип, который даст корректный результат сравнения. Но вот если Вы сделаете параметры функции, к примеру, типа std::string, то получите ошибку компиляции.
Для лучшего пониманию, предлагаю рассмотреть следующий пример:
#include
void myFunc(int x, int y)
{
std::cout << "x: " << x << ", y:" << y << "
";
}
template
int main(int argc, char* argv[])
{
superFunction(myFunc);
}
Здесь, superFunction чем-то похожа на std::sort, она принимает своим аргументом что-то, что можно вызвать с двумя параметрами, причём каждый параметр является int. Внутри это «что-то» вызывается. Передав в функции main нашу myFunc мы получаем вызов оной, косвенно, через superFunc. Точно так же всё происходит в std::sort, только там переданная функция используется для сравнения двух элементов и в эту функцию передаются два члена массива, вместо констант, как в моём коде.
Комментариев нет:
Отправить комментарий