SW/C++

C++ : 람다식 : 개념, 예제, 구성, 방법, 활용법

얇은생각 2020. 4. 28. 07:30
반응형

C++ : 람다식 : 개념, 예제, 구성, 방법, 활용법

 

람다식이란

이름이 없는 함수개체, 내포되는 함수를 의미합니다.

 

[<captures>](<parameters>) <specifiers> -> <retrun_type>
{
  // body
}

 

람다 식을 품는 법위 안에 있는 변수를 람다 식에 넘겨줄 떄 사용합니다.

 

캡처의 종류

[] : 비어 있으므로, 캡처하지 않습니다.

= : 값에 의한 캡처, 모든 외부 변수를 캡처합니다. 람다 식 안에서 수정할 수는 없습니다. 

& : 참조에 의한 캡처입니다. 모든 외부 변수를 캡처합니다.

<변수 이름> : 특정 변수를 값으로 캡처합니다. 람다 식 안에서 수정할 수 없습니다.

& <변수 이름> : 특정 변수를 참조로 캡처합니다.

 

int main (){
    float score1 = 80.f;
    float score2 = 20.f;

	auto max = [=](){
    	return score1 > score2 ? score1 : score2; }
        
    std::cout << "Max value is " << max() << std::endl;
}

 

캡처의 종류에 따라 동작을 다르게 람다식을 구할 수 가 있습니다. 

 

 

int main()
{
    float score1 = 30.f;
    float score2 = 20.f;
    
    auto changeValue = [=, &score1](){
        score1 = 100.4;
        std::cout << score2;
    };
    
    changeValue();
}

 

또한 위처럼 여러 캡처들을 섞어서도 활용할 수 있습니다. 

 

 

 

매개변수 목록

선택 사항으로 넣을 수 있습니다. 빈 괄호를 생략할 수도 있습니다. 

int main()
{
    float score1 = 30.f;
    float score2 = 20.f;
    
    auto changeValue = [](int a, int b){
        return a + b;
    };
    
    std::cout << add(score1, score2) << std::endl;
}

 

매개변수로 함수를 만들어 활용할 수 있습니다. 비교 함수 역시 람다식으로 활용하여 구현할 수 있습니다.

#include<algorithm>
#include<vector>

int main ()
{
  std::vector<float> scores;
  
  scores.push_back(50.f);
  scores.push_back(88.5f);
  scores.push_back(70.f);
  
  std::sort(scores.begin(), scores.end(), [](float a, float b) {return (a > b); });
  std::sort(scores.begin(), scores.end(), [](float a, float b) {return (a <= b); });
  
  return 0;
}

 

 

 

지정자

지정자는 선택 사항으로 mutable이 있습니다. 값에 의해 캡처된 개체를 수정할 수 있게합니다. 괜찮은 언어 디자인이나 C++에서는 너무 늦게 도입됬다고 합니다. 

 

값을 캡처해서 변경하면 컴파일 에러가 나지만, mutable을 선언하면 값을 변경할 수 있게 됩니다. 

int main()
{
  int value = 100;
  
  auto foo = [value]() mutable
  {
    std::cout << ++value << std::endl;
  };
  
  foo();
}

 

 

 

반환형

반환형은 선택사항입니다. 반환형을 적지 않으면 반환문을 통해 유추합니다. 자동 반환 형식을 활용하기 보다는 가독성을 높여서 직접 선언해주는 것을 선호해야 합니다. 

반응형