람다 함수 − Lambda are functions은 기본 프로그램 범위를 벗어나는 구현이 필요하지 않은 인라인 함수입니다.
Lambda 함수는 또한 저장할 변수에 의해 값으로 사용될 수 있습니다. Lambda는 함수(펑터라고 함)에서 호출할 수 있는 객체라고 할 수 있습니다. ).
컴파일러는 람다 함수의 정의를 만날 때마다 일반적으로 람다에 대한 사용자 지정 개체를 만듭니다.
람다 함수는 일반 함수보다 더 많은 기능을 가지고 있습니다. 예를 들어 사용된 변수를 캡처하는 캡처 방법이 있습니다. 그러나 캡처된 변수는 개체의 구성원으로 처리됩니다.
때때로 람다 함수는 자체 범위가 있고 일반 함수 내에서 매개변수로 전달될 수 있는 "함수 개체"라고도 합니다. Lambda 함수에는 고유한 수명이 있습니다.
[ ] - 캡처
( ) - 매개변수(선택사항)
→ - 반환값(선택)
{...} - 기능 본문.
람다의 구문
[ ]( int a) -> int { return a-1 ;};
캡처 – 캡처는 람다 함수가 특정 범위 또는 중첩 블록에서 사용 가능한 변수에 대한 액세스 권한을 부여하는 절입니다.
두 가지 방법을 사용하여 사용 가능한 변수의 값을 캡처할 수 있습니다.
-
이름으로 개체 캡처 – 이름으로 개체를 캡처하면 람다 함수의 로컬 복사본이 만들어집니다.
다음 예를 통해 이 개념을 이해할 수 있습니다. -
int main(){ set s; //Adding the elements to set int i=20; for_each(s.begin(),s.end(), [i](T& elem){ cout<<elem.getVal()*i<<endl; } }
위의 예에서 값은 람다 함수의 로컬 복사본을 생성하여 캡처됩니다.
-
참조로 개체 캡처 – 참조로 개체를 캡처하면 람다 함수의 컨텍스트가 조작됩니다. 따라서 함수 개체 또는 람다 함수에 의해 캡처된 값이 변경될 수 있습니다.
다음 예를 통해 이를 이해할 수 있습니다 -
int main(){ sets; //Adding elements to the set int result=0; for_each(s.begin(),s.end(), [&result](&T elem){ result+= elem.getVal();}); cout<<result<<endl; }
멤버 함수 내부의 람다
람다 함수는 일반 함수 내에서 매개변수로 사용될 수 있다는 것을 알고 있습니다. 예를 들어,
class func{ public: func(set<T>s): s1(s){} void func(){ remove_if(s1.begin(),s1.end(), [this](int i) ->bool {return (i<level);}); } private: set<T>s1; int result; };