일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 아펠가모 선릉
- 아펠가모선릉
- 코프링
- 그라나다
- 스페인
- 바르셀로나
- elk
- db index
- Kotlin
- 코틀린
- 400에러
- HTTP
- git명령어
- c# scv
- sprintboot
- 아펠가모
- b-tree index
- 본식후기
- 세비야
- @Component
- 관심지향프로그래밍
- 코틀린 함수
- 스페인 준비물
- kopring
- 마드리드
- Srping AOP
- http상태코드
- kotiln
- 스프링 AOP
- HTTP #웹기술
- Today
- Total
끄적이는 메모장
[C++11] lambda expression 본문
# lambda expression
__ 오개념 수정은 환영합니다 (_._ )
lambda expression은 함수를 미리 선언하는 것이 아니라 필요할 때 일회성으로 사용 하는 것을 의미한다.
lambda expression은 다양한 모양은 기본적으로 다음과 같다.
[캡쳐블록] (인수목록) -> 반환형 {return 동작정의;}(인수값);
캡쳐 블록은 외부 변수를 사용할 때 괄호 내부에 외부변수를 나타내며, 외부 변수가 없는경우 괄호만 [] 표시한다.
인수 목록은 return을 위한 동작을 정의시 인수가 필요하다면 사용되며, 실제 값은 맨 뒤 인수 값을 통해 전달한다.
반환형은 명시적으로 지정할 수 있으며, 반환형이 없는 경우 return되는 반환 형으로 타입이 결정된다.
(인수록목과 반환형은 생략이 가능하다.)
다양한 상황을 통해 사용법을 알아보자
1. 외부변수 X , 인수사용 X, 반환형 지정 X
auto func1 = [] {return 1;};
auto func2 = [](){
cout << "func1" << endl;
};
func2() -> 실제 정의된 함수를 실행
---------------------------------------
변수에 할당 하지 않고 바로 실행 됨
[]() {
cout << "func1" << endl;
}();
-> 해당 라인에서 실행 된 후 폐기됨, 다른점은 인수값을 받아주는 ()의 존재
2. 외부변수 X, 인수사용X, 반환형 지정 O
auto func3 = [] double{return 1;}; error
auto func4 = []()->double{return 1;};
3. 외부변수X, 인수사용O
auto func5 = [] (int num1, int num2) {rerturn num1 + num2;};
func5(1,2);
vector<int> v = {1, 2, 3, 4, 5}
for_each(v.begin(), v.end(), [] (int v) {
if (v == 3) break;
});
4. 외부변수O, 인수사용O
int flag = 0
vector<int> v = {1, 2, 3, 4, 5}
for_each(v.begin(), v.end(), [&] (int v) {
if (v == 3) {
flag = v;
break;
}
});
cout << flag << endl; // flag = 3
외부변수 사용시 캡쳐 블록의 의미
[ ] -> 외부 변수를 사용하지 않는다
[=] -> 값을 복사하여 사용한다.
[&] -> 값을 참조하여 사용한다.
ex )
[=, &x] -> 사용하는 모든 외부 변수는 복사해서 사용(default)하는데, 변수 x만 참조하겠다.
[&, y] -> 사용하는 모든 외부변수는 참조해서 사용(default)하는데, 변수 y만 복사하겠다.
위 두가지 경우 default가 항상 맨 앞으로 와야한다.
[x, &y] -> x는 복사해서, y는 참조해서 사용하겠다.
'C, C++, C# > C++ 공부' 카테고리의 다른 글
[C++11] mutex (0) | 2018.06.01 |
---|---|
[C++11] std::bind, std::placeholder (0) | 2018.05.31 |
[C++11] range for loop (0) | 2018.05.30 |
[C++11] make_shared (0) | 2018.05.30 |
[C++11] shared_ptr / weak_ptr (0) | 2018.05.30 |