1.4Kпросмотров
13 сентября 2024 г.
Score: 1.5K
Предикаты Все сталкивались либо просто знают про библиотеку algorithm, в ней есть множество шаблонных функций которые облегчают работу.Все они УНИВЕРСАЛЬНЫЕ так как в аргументы принимают не контейнер целиком и не ссылки на него, а итераторы , которые позволяют проходить объекты без особого различия между разными типами контейнеров. Что такое предикаты?
Это функция или объект (у которого перегружен bool operator()) который имеет меньше двух параметров включительно.Предикаты бывают унарными(один параметр) и бинарными(два параметра). Но зачем вообще давать этому отдельное название?
А дело в том, что почти все алгоритмы библиотеки STL принимают предикат последним аргументом.Мы можем возвращать что хотим (true/false) и от этого будет зависеть содержимое контейнера.Для примера возмем алгоритм sort():
Он перегружен и имеет два вида: Имеет два параметра которые обозначают диапазон begin,end). Имеет три параметра первые два обозначают диапазон [begin,end), а третий - бинарный предикат. Первыйй тип это обычная функция sort которая сортирует элементы в диапазоне в порядке возрастания.
Во втором мы можем коректировать как именно мы хотим отсортировать его. Пример (первый с функцией, второй с лямбдой):
#include <iostream>
#include <algorithm>
#include <vector> using namespace std; bool predicate(int lhs,int rhs){ return !(lhs < rhs); // in parentheses due to precedence
} int main(){ vector<int> v{0,512,22,54,222,10}; sort(v.begin(),v.end(),predicate); for(const auto& i : v) cout<<i<<" ";
}
#include <iostream>
#include <algorithm>
#include <vector> using namespace std; int main(){ vector<int> v{0,512,22,54,222,10}; sort(v.begin(),v.end(),[{ return !(lhs < rhs); }); for(const auto& i : v) cout<<i<<" ";
}
Вывод будет одинаковым: 512 222 54 22 10 0