Ответ
Предикат в C++ — это вызываемый объект (функция, лямбда, функтор), возвращающий значение, конвертируемое в bool.
- Унарный предикат принимает один аргумент.
- Бинарный предикат принимает два аргумента.
Различие в количестве аргументов определяет, в каких алгоритмах STL их можно использовать.
Примеры использования:
Унарный предикат (например, в std::find_if, std::remove_if, std::all_of):
// Лямбда как унарный предикат: проверяет, является ли число четным.
auto isEven = [](int x) -> bool { return x % 2 == 0; };
std::vector<int> data = {1, 3, 2, 5, 4};
// find_if передает каждый элемент вектора в isEven по одному.
auto it = std::find_if(data.begin(), data.end(), isEven);
if (it != data.end()) {
std::cout << "Первое четное число: " << *it << std::endl; // Выведет: 2
}
Бинарный предикат (например, в std::sort, std::lower_bound, std::set с пользовательским компаратором):
// Функтор как бинарный предикат: сравнивает строки по длине.
struct CompareByLength {
bool operator()(const std::string& a, const std::string& b) const {
return a.size() < b.size();
}
};
std::vector<std::string> words = {"apple", "pie", "banana", "a"};
// sort передает пары элементов из вектора в компаратор.
std::sort(words.begin(), words.end(), CompareByLength());
// words теперь: ["a", "pie", "apple", "banana"]
Современный C++: Чаще всего в качестве предикатов используют лямбда-выражения прямо на месте вызова алгоритма, что делает код компактным и читаемым.
std::sort(words.begin(), words.end(),
[](const auto& a, const auto& b) { return a.size() < b.size(); });