끄적이는 메모장

[C++11] lambda expression 본문

C, C++, C#/C++ 공부

[C++11] lambda expression

밥보92 2018. 5. 31. 10:32
반응형

# 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는 참조해서 사용하겠다.

반응형

'C, C++, C# > C++ 공부' 카테고리의 다른 글

[C++11] mutex  (0) 2018.06.01
[C++11] std::bind, std::placeholder  (0) 2018.05.31
[C++11] range for loop  (0) 2018.05.30
[C++11] make_shared  (0) 2018.05.30
[C++11] shared_ptr / weak_ptr  (0) 2018.05.30