본문 바로가기
놀기/C, C++

C++ 람다 식 공부 (5) - Examples

by Hi~ 2021. 7. 23.

2021.07.21 - [일하기/C++] - C++ 람다 식 공부 (1)

2021.07.22 - [일하기/C++] - C++ 람다 식 공부 (2)

2021.07.22 - [일하기/C++] - C++ 람다 식 공부 (3)

2021.07.23 - [일하기/C++] - C++ 람다 식 공부 (4) - Examples

 

 


 

Higher-Order 람다 함수

 

예제

많은 프로그래밍 언어에서 고차 함수의 개념을 지원합니다. 고차 함수는 람다 식으로, 다른 람다 식을 인수로 취하거나 람다 식을 반환합니다. 클래스를 사용하여 function c + + 람다 식이 상위 함수처럼 동작하도록 할 수 있습니다. 다음 예제에서는 function 개체를 반환하는 람다 식과 인수로서 function 개체를 취하는 람다 식을 보여 줍니다.

코드

// higher_order_lambda_expression.cpp
// compile with: /EHsc /W4
#include <iostream>
#include <functional>

int main()
{
    using namespace std;

    // The following code declares a lambda expression that returns
    // another lambda expression that adds two numbers.
    // The returned lambda expression captures parameter x by value.
    auto addtwointegers = [](int x) -> function<int(int)> {
        return [=](int y) { return x + y; };
    };

    // The following code declares a lambda expression that takes another
    // lambda expression as its argument.
    // The lambda expression applies the argument z to the function f
    // and multiplies by 2.
    auto higherorder = [](const function<int(int)>& f, int z) {
        return f(z) * 2;
    };

    // Call the lambda expression that is bound to higherorder.
    auto answer = higherorder(addtwointegers(7), 8);

    // Print the result, which is (7+8)*2.
    cout << answer << endl;
}

 

출력

30
● function class 참조

 


 

함수에서 람다 식 사용

 

예제

함수의 본문에서 람다 식을 사용할 수 있습니다. 람다 식은 바깥쪽 함수에서 액세스할 수 있는 모든 함수 또는 데이터 멤버에 액세스 할 수 있습니다. this 바깥쪽 클래스의 함수 및 데이터 멤버에 대한 액세스를 제공하기 위해 포인터를 명시적 또는 암시적으로 캡처할 수 있습니다. Visual Studio 2017 버전 15.3 이상 (에서 사용 가능 /std:c++17 ): 원래 개체가 범위를 벗어난 후 실행될 수 있는 비동기 또는 병렬 작업에서 람다를 사용하는 경우 this([*this])를 캡처합니다.

다음과 같이 함수에서 명시적으로 this 포인터를 사용할 수 있습니다.

// capture "this" by reference
void ApplyScale(const vector<int>& v) const
{
   for_each(v.begin(), v.end(),
      [this](int n) { cout << n * _scale << endl; });
}

// capture "this" by value (Visual Studio 2017 version 15.3 and later)
void ApplyScale2(const vector<int>& v) const
{
   for_each(v.begin(), v.end(),
      [*this](int n) { cout << n * _scale << endl; });
}

 

this 포인터를 암시적으로 캡처할 수도 있습니다.

void ApplyScale(const vector<int>& v) const
{
   for_each(v.begin(), v.end(),
      [=](int n) { cout << n * _scale << endl; });
}

 

다음 예제에서는 소수 자릿수 값을 캡슐화하는 Scale 클래스를 보여 줍니다.

// function_lambda_expression.cpp
// compile with: /EHsc /W4
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

class Scale
{
public:
    // The constructor.
    explicit Scale(int scale) : _scale(scale) {}

    // Prints the product of each element in a vector object
    // and the scale value to the console.
    void ApplyScale(const vector<int>& v) const
    {
        for_each(v.begin(), v.end(), [=](int n) { cout << n * _scale << endl; });
    }

private:
    int _scale;
};

int main()
{
    vector<int> values;
    values.push_back(1);
    values.push_back(2);
    values.push_back(3);
    values.push_back(4);

    // Create a Scale object that scales elements by 3 and apply
    // it to the vector object. Does not modify the vector.
    Scale s(3);
    s.ApplyScale(values);
}

 

출력

3
6
9
12

 

설명

ApplyScale 함수는 람다 식을 사용하여 vector 개체에서 스케일 값 및 각 요소의 곱을 출력합니다. 람다 식이 _scale 멤버에 접근하기 위해 암시적으로 this를 캡처합니다.

 

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

C++ 람다 식 공부 (6) - Examples  (0) 2021.07.23
C++ 람다 식 공부 (4) - Examples  (0) 2021.07.23
C++ 람다 식 공부 (3)  (0) 2021.07.22
C++ 람다 식 공부 (2)  (0) 2021.07.22
C++ 람다 식 공부 (1)  (0) 2021.07.21

댓글