C++의 람다 함수
- C++에서 Lambda 함수의 구문
- C++에서 일반 함수 포인터를 사용하여 Lambda 함수 구현
-
C++에서
std::function
을 사용하여 Lambda 함수 구현 -
C++에서
auto
를 사용하여 Lambda 함수 구현 - C++에서 Lambda 함수 사용
이 기사에서는 관련 예제와 함께 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 a
및 double 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 a
와 double 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);