What's Lambda?
Lambda is Function Object
When to use?
한번 쓰고 말 간단한 함수
ex) sort compare , set || priority queue costructor comporator
클로저 기법을 통한 Function Object 생성
#include <iostream>
using namespace std;
class LambdaTest {
private:
int localVariable;
public:
// this is closure
explicit LambdaTest(int a) : localVariable{a} {};
int LambdaTest::operator()(int x) const {
// function object return
return localVariable + x;
}
};
int main()
{
// create function object (lambda)
LambdaTest lambdaTestPlus10(10);
cout << lambdaTestPlus10(30) << endl;
// expected output '40'
return 0;
}
람다(익명) 함수 생성
int main()
{
/*
LambdaTest lambdaTestPlus10(10);
cout << lambdaTestPlus10(30) << endl;
*/
int fifty{50};
auto lambdaTestPlus50 = [&fifty](int x) -> int {
return x + fifty;
};
cout << lambdaTestPlus50(30) << endl;
// expected output is 80
return 0;
}
클로저 기법을 통한 Function object 나 Lambda 함수 모두 어셈블리 단계에서 내부적 동작은 완벽히 일치한다.
struct 함수 객체 (state)저장 으로 한번
struct 저장없이 lamba를 통한 boolean compare function parameter 자체로 넘기기.
예제2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include <iostream>
#define SWAP(a,b) do {\
int temp = a; \
a = b; \
b = temp; \
} while(0)
using namespace std;
struct UP {
bool operator() (int a, int b) const{
return a > b;
}
};
struct DOWN {
bool operator() (int a, int b) const{
return a < b;
}
};
template <typename T>
void bubble_sort(int arr[], int size, const T& cmp_func){
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (cmp_func(arr[i], arr[j])) {
SWAP(arr[i], arr[j]);
}
}
}
}
void print_arr(int arr[],const int size) {
for (auto i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << '\n';
}
int main(void) {
UP up;
DOWN down;
int arr[10] = {5, 7, 2, 4, 6, 9, 1, 8, 10, 3};
const int arr_size = sizeof(arr) / sizeof(int);
bubble_sort(arr, arr_size, up);
print_arr(arr, arr_size);
bubble_sort(arr, arr_size, down);
print_arr(arr, arr_size);
bubble_sort(arr, arr_size, [](const int x,const int y)->bool {return (x >= y);});
print_arr(arr, arr_size);
bubble_sort(arr, arr_size, [](const int x,const int y)->bool {return (x < y);});
print_arr(arr, arr_size);
return 0;
}
|
w
※ parameter 넘길 때 const, 받을때도 const T&
Call By Reference 이므로 당연히 const 떡칠을 해야한다.
멤버함수 끝에 const가 붙는 함수 (상수 멤버 함수) 이유 2가지
1. body{} 안에서 어떤 변수도 바꿀 수 없음(mutable은 예외)
2. body{} 안에서 const 아닌 함수를 호출할 수 없음.
=> 모두 임의의 값 변경, 임의 함수 객체 주소변경을 방지하기 위함. (const를 통한 상수 함수Functor의 기획 의도)
오로지 변수, 함수를 읽거나 호출만 하여 값 변경을 방지하고자함. (프로그래머에게도 끝에 const가 붙은걸 보임으로써 이 함수는 값 변경이 없는 함수임을 명시)
[Reference]
https://modoocode.com/219, https://modoocode.com/197
https://hwan-shell.tistory.com/84?category=703822
www.youtube.com/watch?v=YlTySznnISY&list=PLDV-cCQnUlIa9cy9one-i9foU8DwErnSp&index=3
'C > C++' 카테고리의 다른 글
[C++] lvalue vs rvalue (0) | 2020.03.30 |
---|---|
[C++] typedef 대신 using을 사용하자 (0) | 2020.03.30 |
[C++] template <typename T> (0) | 2020.03.23 |
[C++ 11] NULL vs nullptr (0) | 2020.03.21 |
[C++] auto (0) | 2020.03.21 |