profile image

L o a d i n g . . .

반응형

간단한 함수를 람다로 표현하기

  • 람다 표현식: 함수의 익명 표기법. 함수형 프로그래밍에서 일급 함수(first class function)와 순수 함수(pure function)를 만들 때 유용하다.
  • [...] (...) {...}
    • [] - 캡처 목록(capturing list)
      • 람다 표현식 바깥의 변수를 람다 본문에서 어떻게 접근하는지를 나타낸다.
      • 람다 표현식의 시작을 나타낸다.
      • 캡처 목록에 &를 사용하면 바깥 범위에 있는 변수를 참조로 캡처하고, =를 쓰면 값으로 캡처한다.
    • () - 매개변수 목록(parameter list)
    • {} - 본문
      for_each(
      begin(vehicles),
      end(vehicles),
      [](const Vehicle &vehicle)
      {
      cout << vehicle.GetType() << endl;
      });

 


여러 줄의 함수를 람다로 표현하기

// 벡터 vect 선언 후 0~9 숫자 push_back

for_each(
    begin(vect),
    end(vect),
    [](int n)
    {
        cout << n << " is";
        if (n < 2)
        {
            if (n == 0) cout << " not";
        }
        else
        {
            for (int j = 2; j < b; ++j)
            {
                if (n % j == 0)
                {
                    cout << " not";
                    break;
                }
            }
        }

        cout << " prime number" << endl;
    });

 


람다 표현식에서 값 캡처하기

int a = 2;
int b = 8;

for_each(
    begin(vect),
    end(vect),
    // 명시적으로 해당 변수만 값으로 캡처한다.
    [a,b](int n)
    {
        if (n >= a && n <= b)
            cout << n << " ";
    });

a = 3;
b = 7;

for_each(
    begin(vect),
    end(vect),
    // 암시적으로 모든 변수를 값으로 캡처한다.
    [=](int n)
    {
        if (n >= a && n <= b)
            cout << n << " ";
    });
for_each(
    begin(vect),
    end(vect),
    // 두 변수를 캡처하지만, mutable 키워드 때문에 실제로 수정되지 않는다.
    [=](int& x) mutable
    {
        const int old = x;
        x *= 2;
        a = b;
        b = old;
    });
  • mutable 키워드를 사용했기 때문에 최종 결과값은 변경 없이 그대로 남게 된다.
  • 만약 이 예제에서 a와 b의 값을 수정하고 싶다면 참조를 캡처해야 한다.
for_each(
    begin(vect),
    end(vect),
    [&a, &b](int& x)
    {
        const int old = x;
        x *= 2;
        a = b;
        b = old;
    });

 


초기화 캡처

  • 초기화 캡처(Initialization Capture): 변수의 값을 캡처해서 람다 표현식의 변수에 할당할 수 있다. C++14에 추가됐다.
int a = 5;

// a를 사용해서 람다에서 사용하는 변수 x를 초기화한다.
auto myLambda = [&x = a]() { x += 2; };

myLambda();

// 출력값 == 7
cout << a << endl;

 


제너릭 람다 표현식

  • C++14부터 매개변수 목록에도 auto 사용이 가능하다.
auto findMax = [](auto &x, auto &y)
{
    return x > y ? x : y;
};

int inta = 5, intb = 3;
float floa = 2.5f, f2 = 2.05f;

cout << findMax(inta, intb) << endl;
cout << findMax(floa, flob) << endl;

 

 

해당 포스트는 '모던 C++로 배우는 함수형 프로그래밍' 도서를 읽으며 개인 백업용으로 메모하였습니다.

알라딘: www.aladin.co.kr/shop/wproduct.aspx?ItemId=138158223

 

모던 C++로 배우는 함수형 프로그래밍

모던 C++의 새로운 기능과 함수형 프로그래밍을 다룬다. 기능이나 개념별로 예제 코드를 작성하고 실행하며 공부할 수 있도록 구성했다. 기본 문법은 자세히 설명하지 않으므로 C++ 사용 경험이

www.aladin.co.kr

반응형
복사했습니다!