Make Unreal REAL.
article thumbnail
Published 2023. 1. 21. 18:22
람다 식(Lambda expression) C++/기타

 

Lambda 식 함수

  • compile time에 클래스로 처리되며 실제로는 functor class가 생성된다.
  • 캡처 변수를 갖는 Lambda 식 함수는 생성자를 갖는다.
  • 메모리나 성능 면에서 클래스나 함수 호출보다 비용이 저렴하다.
  • 클래스 변수 생성과 동일하게 스택에 할당 된다.

 

#include <iostream>
#include <array>
#include <algorithm>

using namespace std;

void main()
{
    // 반환 형식을 명시
    cout << [](int a, int b) -> int { return a + b; }(10, 20) << endl;
    
    // 반환 형식을 생략
    cout << [](float a, float b) { return a + b; }(1.1, 2.2) << endl;
    
    array<int, 5> arr({3, 2, 5, 1, 4});
    
    // Lambda 식 함수는 실제로는 functor이다.
    sort(arr.begin(), arr.end(), [](const int& a, const int& b) { return a < b; });
    
    for_each(arr.begin(), arr.end(), [](int e) { cout << e << ' '; });
    cout << endl;
}

 

출력

30
3.3
1 2 3 4 5

 

캡처의 사용 방법

  • 캡처 변수는 레퍼런스로 전달하지 않으면 값의 수정이 불가능하다.
  • static 변수는 캡처하지 않고도 사용할 수 있다.

 

#include <iostream>
#include <algorithm>

using namespace std;

void main()
{
    static int stNum = 1;
    int num1 = 1, num2 = 2, num3 = 3;
    
    // static 변수는 캡처하지 않고도 사용 가능
    [num1]() { cout << "stNum + num1: " << stNum + num1 << endl << endl; }();
    
    // 복사해서 캡처
    // 값 수정이 블가능
    [num1]() { cout << "num1: " << num1 << endl; }();
    
    // 레퍼런스로 캡처
    // 값 수정이 가능
    [&num1]() { cout << "++&num1: " << ++num1 << endl << endl; }();
    
    // 모든 변수 복사해서 캡처
    [=]()
    {
        cout << "num1: " << num1 << endl;
        cout << "num2: " << num2 << endl;
        cout << "num3: " << num3 << endl << endl;
    }();
    
    // 모든 변수 레퍼런스로 캡처
    [&]()
    {
        cout << "++&num1: " << ++num1 << endl;
        cout << "++&num2: " << ++num2 << endl;
        cout << "++&num3: " << ++num3 << endl << endl;
    }();
    
    // 모든 변수 복사해서 캡처하되 num2만 레퍼런스로 캡처
    [=, &num2]()
    {
        cout << "num1: " << num1 << endl;
        cout << "++&num2: " << ++num2 << endl;
        cout << "num3: " << num3 << endl << endl;
    }();
    
    // 모든 변수 레퍼런스로 캡처하되 num3만 복사해서 캡처
    [&, num3]()
    {
        cout << "++&num1: " << ++num1 << endl;
        cout << "++&num2: " << ++num2 << endl;
        cout << "num3: " << num3 << endl << endl;
    }();
    
    string s = "Hello World !";
    
    for_each(s.begin(), s.end(), [](char &c) { ++c; });
    
    cout << s << endl;
}

 

출력

stNum + num1: 2

num1: 1
++&num1: 2

num1: 2
num2: 2
num3: 3

++&num1: 3
++&num2: 3
++&num3: 4

num1: 3
++&num2: 4
num3: 4

++&num1: 4
++&num2: 5
num3: 4

Ifmmp!Xpsme!"

'C++ > 기타' 카테고리의 다른 글

디폴트 매개변수(Default Parameter)  (0) 2023.01.30
실수를 비교하는 방법  (0) 2023.01.30
펑터(Functor)  (0) 2023.01.21
템플릿(Template)  (0) 2023.01.20
깊은 복사와 얕은 복사  (0) 2023.01.20
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그