반응형
람다식이란
이름이 없는 함수개체, 내포되는 함수를 의미합니다.
[<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();
}
반환형
반환형은 선택사항입니다. 반환형을 적지 않으면 반환문을 통해 유추합니다. 자동 반환 형식을 활용하기 보다는 가독성을 높여서 직접 선언해주는 것을 선호해야 합니다.
반응형
'SW > C++' 카테고리의 다른 글
C++ : unordered_map : 개념, 장점, 예제, 구현 (0) | 2020.04.30 |
---|---|
C++ : 람다식 : 장점, 단점, 배스트 프랙티스, 예제, 구현 (0) | 2020.04.29 |
C++ : constexpr : 개념, 예제, 사용법, 필요성, 장점 (0) | 2020.04.27 |
C++ : 이동대입연산자 : 개념, 예제, 활용방법 (0) | 2020.04.26 |
C++ : lvalue, rvalue, move, 이동생성자 : 개념, 장점, 필요성 (0) | 2020.04.25 |