C++의 람다 함수

Anam Javed 2023년10월12일
  1. C++에서 Lambda 함수의 구문
  2. C++에서 일반 함수 포인터를 사용하여 Lambda 함수 구현
  3. C++에서 std::function을 사용하여 Lambda 함수 구현
  4. C++에서 auto를 사용하여 Lambda 함수 구현
  5. C++에서 Lambda 함수 사용
C++의 람다 함수

이 기사에서는 관련 예제와 함께 C++에서 Lambda 함수의 구문 및 구현에 대해 자세히 설명합니다.

C++에서 Lambda 함수 또는 익명 함수는 다른 함수 내에서 익명으로 정의됩니다. 소스 코드에 인라인으로 작성되고 호출 가능한 개체를 사용하는 다른 함수에 인수로 전달됩니다.

이것은 C++ 프로그래머를 위한 함수 생성을 쉽고 빠르게 만듭니다. 이러한 함수에는 이름이 없으며 재사용되지 않습니다.

C++에서 Lambda 함수의 구문

일반 구문:

[Capture List](Parameter List) { Function Body; }

Capture List는 컴파일러에게 람다 함수가 생성되었음을 알려줍니다.

함수 본문 내에서 변수를 사용하려면 먼저 캡처 목록 내에서 변수를 캡처해야 합니다. 그렇게 하지 않으면 함수 본문의 범위를 벗어납니다.

캡처된 변수는 복사본 또는 참조로 액세스할 수 있습니다. 변수를 캡처하는 것은 일반 함수에서 인수를 전달하는 것으로 간주되지 않습니다.

여기서 a는 값으로 캡처됩니다.

auto f = [a]() { return a * 9; };

여기에서 a는 참조로 캡처됩니다.

auto f = [&a]() { return a++; };

Parameter List는 이름에서 알 수 있듯이 일반 함수처럼 내부에 인수를 취합니다. 전달할 인수가 없는 경우 작성하는 것은 선택 사항입니다.

이랑 ():

auto call_foo = [x]() { x.foo(); };

() 없이:

auto call_foo2 = [x] { x.foo(); };

위의 두 람다 함수는 모두 동일한 의미를 갖습니다.

Function Body에는 다른 일반 함수와 마찬가지로 실행될 코드가 포함되어 있습니다.

int mul = 5;
auto ans = [mul](int a) { return a * mul; };
std::out << ans(2);

출력:

5

C++의 Lambda 함수 예:

#include <iostream>
#include <string>
using namespace std;

int main() {
  auto sum = [](int a, int b) { return a + b; };
  cout << "Sum of two integers:" << sum(5, 5) << endl;
  return 0;
}

출력:

Sum of two integers: 10

auto 키워드를 사용하여 매개변수의 데이터 유형이 런타임에 결정됨을 나타냅니다. 이에 대해서는 다음 섹션에서 더 자세히 설명합니다.

C++에서 일반 함수 포인터를 사용하여 Lambda 함수 구현

함수 포인터를 사용하여 C++에서 람다 함수를 구현할 수 있습니다.

int main() {
  double (*addNum1)(double, double){[](double a, double b) { return (a + b); }};
  addNum1(1, 2);
}

출력:

3

여기서 *addNum1은 빈 캡처 절에서만 작동하는 표준 함수 포인터입니다. 그 후 매개 변수 유형이 선언됩니다 - double, double.

이것을 함수 프로토타입이라고 합니다. 컴파일러에 대해 Lambda 함수가 생성되었음을 나타내는 빈 캡처 절을 관찰할 수 있습니다.

또한 두 개의 변수가 매개변수 목록에 전달됩니다. double adouble b. 그리고 함수 본문 내에서 이러한 변수의 추가가 반환됩니다.

메인 함수가 닫힌 후 addNum(1,2) 함수가 호출되고 3이 출력으로 반환됩니다.

C++에서 std::function을 사용하여 Lambda 함수 구현

std::function addNum{[](double a, double b) { return (a + b); }};
addNumbers2(3, 4);

출력:

7

std::function은 람다 함수를 매개변수로 전달하고 값을 반환합니다. 이를 통해 템플릿의 인수 목록 및 반환 값에 대한 정확한 유형을 선언할 수 있습니다.

여기에서 매개변수 목록에 double adouble b라는 두 개의 변수가 전달됩니다. 그리고 함수 본문 내에서 이러한 변수의 추가가 반환됩니다.

메인 함수가 닫힌 후 addNum(1,2) 함수가 호출되고 7이 출력으로 반환됩니다.

C++에서 auto를 사용하여 Lambda 함수 구현

auto addNum{[](double a, double b) { return (a + b); }};
addNum(5, 6);
return 0;

출력:

11

람다는 유형이 없기 때문에 직접 사용할 수 없습니다. 결과적으로 람다 함수를 만들 때 컴파일러는 고유한 유형의 매개변수를 생성합니다.

어떤 종류의 람다 함수인지는 모르지만 정의 후 사용하기 위해 저장하는 방법은 많습니다. 람다의 실제 유형을 사용하는 유일한 방법은 auto를 사용하는 것입니다.

Lambda 함수는 auto로 선언한 후 C++ 프로그램 어디에서나 사용할 수 있습니다.

C++에서 Lambda 함수 사용

람다 표현식은 일반적으로 알고리즘을 캡슐화하여 다른 함수에 전달하는 데 사용됩니다.

람다 함수는 [ ](double a, double b) 정의 직후에 실행할 수 있습니다.

{return (a + b)}();  // immediately executed lambda expression
{ return (a + b) }  // simple code block

보시다시피, 람다 식은 복잡한 기능을 재구성하는 효과적인 도구입니다.

명시적 매개변수화 프로세스는 중간 테스트와 함께 단계별로 수행될 수 있습니다. 코드 블록이 적절하게 매개변수화되면 외부 위치로 재배치하고 정상 기능으로 만듭니다.

또한 람다 표현식을 사용하면 불필요한 로직을 제거하는 데 도움이 될 수 있는 명명된 중첩 함수를 빌드할 수 있습니다. 중요하지 않은 함수를 다른 함수의 매개변수로 제공할 때 명명된 람다를 사용하는 것이 눈에 더 쉽습니다.

auto algo = [&](double x, double m, double b) -> double { return mx + b; };
int l = algorithm(1, 2, 3), m = algorithm(4, 5, 6);
메모
Lambda는 또한 모든 데이터 유형에 대해 일반화될 수 있습니다.

관련 문장 - C++ Lambda