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 |