← Назад ко всем вопросам

Зачем нужны поля в лямбда-функции

1️⃣ Как кратко ответить

Поля в лямбда-функции позволяют захватывать переменные из окружающего контекста, чтобы использовать их внутри лямбда-выражения. Это необходимо для передачи данных в лямбда-функцию, которые не являются её параметрами, и для сохранения состояния между вызовами.

2️⃣ Подробное объяснение темы

Лямбда-функции в C++ — это анонимные функции, которые могут быть определены в месте их использования. Они часто используются для создания небольших функций, которые передаются как аргументы другим функциям, например, алгоритмам стандартной библиотеки. Одной из ключевых особенностей лямбда-функций является возможность захвата переменных из окружающего контекста, что позволяет им использовать данные, которые не передаются напрямую через параметры.

Захват переменных

Лямбда-функции могут захватывать переменные из окружающего контекста двумя основными способами: по значению и по ссылке. Это позволяет лямбда-функции использовать и изменять переменные, которые находятся вне её тела.

  • Захват по значению ([=]): Лямбда-функция копирует значение переменной из окружающего контекста. Изменения, сделанные внутри лямбда-функции, не влияют на оригинальную переменную.

  • Захват по ссылке ([&]): Лямбда-функция захватывает ссылку на переменную, что позволяет изменять её значение. Изменения, сделанные внутри лямбда-функции, будут видны и в окружающем контексте.

Пример использования

Рассмотрим пример, где лямбда-функция используется для фильтрации элементов в векторе:

#include <iostream>
#include <vector>
#include <algorithm>
​
int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    int threshold = 3;
​
    // Лямбда-функция, которая захватывает переменную threshold по значению
    auto is_greater_than_threshold = [threshold](int number) {
        return number > threshold; // Использует захваченное значение threshold
    };
​
    // Используем стандартный алгоритм std::count_if с лямбда-функцией
    int count = std::count_if(numbers.begin(), numbers.end(), is_greater_than_threshold);
​
    std::cout << "Количество элементов больше " << threshold << ": " << count << std::endl;
​
    return 0;
}

Объяснение кода:

  • std::vector<int> numbers = {1, 2, 3, 4, 5};: Создаем вектор numbers, содержащий несколько целых чисел.
  • int threshold = 3;: Определяем переменную threshold, которая будет использоваться для фильтрации.
  • auto is_greater_than_threshold = [threshold](int number) {...};: Определяем лямбда-функцию, которая захватывает threshold по значению. Эта функция принимает один параметр number и возвращает true, если number больше threshold.
  • std::count_if(numbers.begin(), numbers.end(), is_greater_than_threshold);: Используем стандартный алгоритм std::count_if, чтобы подсчитать количество элементов в numbers, которые удовлетворяют условию, заданному лямбда-функцией.
  • std::cout << ...;: Выводим результат на экран.

Зачем это нужно

Захват переменных в лямбда-функциях позволяет создавать более гибкие и мощные функции, которые могут взаимодействовать с данными из окружающего контекста. Это особенно полезно в функциональном программировании и при работе с алгоритмами стандартной библиотеки, где часто требуется передавать функции в качестве аргументов. Захват переменных позволяет лямбда-функциям сохранять состояние и использовать его между вызовами, что делает их более универсальными и удобными в использовании.

Тема: C++ Язык (квалификаторы, cast, категории значений)
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки