[C++11] lambda expression
# lambda expression
__ 오개념 수정은 환영합니다 (_._ )
lambda expression은 함수를 미리 선언하는 것이 아니라 필요할 때 일회성으로 사용 하는 것을 의미한다.
lambda expression은 다양한 모양은 기본적으로 다음과 같다.
[캡쳐블록] (인수목록) -> 반환형 {return 동작정의;}(인수값);
캡쳐 블록은 외부 변수를 사용할 때 괄호 내부에 외부변수를 나타내며, 외부 변수가 없는경우 괄호만 [] 표시한다.
인수 목록은 return을 위한 동작을 정의시 인수가 필요하다면 사용되며, 실제 값은 맨 뒤 인수 값을 통해 전달한다.
반환형은 명시적으로 지정할 수 있으며, 반환형이 없는 경우 return되는 반환 형으로 타입이 결정된다.
(인수록목과 반환형은 생략이 가능하다.)
다양한 상황을 통해 사용법을 알아보자
1. 외부변수 X , 인수사용 X, 반환형 지정 X
auto func1 = [] {return 1;};
auto func2 = [](){
cout << "func1" << endl;
};
func2() -> 실제 정의된 함수를 실행
---------------------------------------
변수에 할당 하지 않고 바로 실행 됨
[]() {
cout << "func1" << endl;
}();
-> 해당 라인에서 실행 된 후 폐기됨, 다른점은 인수값을 받아주는 ()의 존재
2. 외부변수 X, 인수사용X, 반환형 지정 O
auto func3 = [] double{return 1;}; error
auto func4 = []()->double{return 1;};
3. 외부변수X, 인수사용O
auto func5 = [] (int num1, int num2) {rerturn num1 + num2;};
func5(1,2);
vector<int> v = {1, 2, 3, 4, 5}
for_each(v.begin(), v.end(), [] (int v) {
if (v == 3) break;
});
4. 외부변수O, 인수사용O
int flag = 0
vector<int> v = {1, 2, 3, 4, 5}
for_each(v.begin(), v.end(), [&] (int v) {
if (v == 3) {
flag = v;
break;
}
});
cout << flag << endl; // flag = 3
외부변수 사용시 캡쳐 블록의 의미
[ ] -> 외부 변수를 사용하지 않는다
[=] -> 값을 복사하여 사용한다.
[&] -> 값을 참조하여 사용한다.
ex )
[=, &x] -> 사용하는 모든 외부 변수는 복사해서 사용(default)하는데, 변수 x만 참조하겠다.
[&, y] -> 사용하는 모든 외부변수는 참조해서 사용(default)하는데, 변수 y만 복사하겠다.
위 두가지 경우 default가 항상 맨 앞으로 와야한다.
[x, &y] -> x는 복사해서, y는 참조해서 사용하겠다.