❗이 글은 ChatGPT와의 질답을 통해 작성되었습니다.
개요
- C++의 lambda는 익명 함수를 생성하는 방법 중 하나입니다.
- lambda 표현식은 함수의 헤더와 바디를 한 줄에 작성할 수 있어 간결한 코드를 작성할 수 있습니다. lambda 표현식은 기본 형식이 ->리턴타입 {함수 본문} 입니다. 이때, 인자리스트나 리턴타입은 생략 가능합니다.
- C++의 lambda 함수의 []는 capture list라고 불리며, 함수 바디 내부에서 참조할 수 있는 외부 변수를 정의합니다.
- [] : 아무런 변수도 캡처하지 않습니다.
- [x, &y]: x라는 이름의 변수를 값으로 캡처하고 y라는 이름의 변수를 참조로 캡처합니다.
- [&] : 외부 모든 변수를 참조로 캡처합니다.
- [=]: 외부 모든 변수를 값으로 캡처합니다.
예를 들어, 아래 코드는 x라는 변수를 값으로 캡처하여 함수 내부에서 x라는 변수를 참조 할 수 있도록 합니다.
int x = 10;
auto add_x = [x](int y) { return x + y; };
std::cout << add_x(3) << std::endl;
- C++의 lambda 함수는 기본적으로 inline으로 구현됩니다. 이는 함수 호출 시에 함수 본문이 호출되는 곳으로 복사되어 컴파일되기 때문입니다.
- 그러나, C++의 inline 키워드는 컴파일러에게 이 함수가 inline으로 구현되라는 권유만 하며, 컴파일러는 이를 무시할 수 있습니다. 그러므로 lambda 함수를 inline으로 구현할 필요는 없으며, 컴파일러가 자동으로 이를 최적화 할 것입니다.
- 그러나 특정 경우에는 컴파일러가 자동으로 이를 최적화 하지 못할 수도 있습니다. 그러므로 꼭 필요한 경우에만 이를 사용 하는 것이 좋습니다.
예제코드
예를 들어, 아래와 같은 두 숫자를 더하는 함수를 lambda 표현식으로 작성할 수 있습니다.
#include <iostream>
int main() {
auto add = [](int x, int y) { return x + y; };
std::cout << add(3, 4) << std::endl;
return 0;
}
위 코드는 [](int x, int y) { return x + y; } 이라는 lambda 표현식을 add 라는 이름의 익명 함수로 정의합니다.
이 lambda 표현식은 int 타입의 x, y라는 인자를 갖고 x+y를 리턴합니다. 이를 이용해 간단히 3+4=7을 출력합니다.
만약, 람다 함수가 인자를 갖지 않고, 리턴 값도 없다면 아래와 같이 작성할 수 있습니다.
#include <iostream>
int main() {
auto print = [](){ std::cout<<"Hello World!"<<std::endl;};
print();
return 0;
}
위 코드는 { std::cout<<"Hello World!"<<std::endl;}라는 lambda 표현식을 print라는 이름의 익명 함수로 정의합니다. 이 lambda 표현식은 인자를 갖지 않고 "Hello World!"를 출력합니다.
응용사례
C++의 lambda 함수는 STL 알고리즘 사용시 유용합니다.
예를들어, std::sort 함수를 사용하여 벡터를 정렬할 때 사용할 수 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5};
std::sort(v.begin(), v.end(), [](int a, int b){ return a > b;});
for(auto x : v) {
std::cout << x << " ";
}
return 0;
}
위 코드는 v 벡터를 [](int a, int b){ return a > b;}라는 lambda 함수로 정렬합니다. 이 lambda 함수는 기본적으로 a > b를 리턴하는 함수로 구현되어 있어 벡터 v를 내림차순으로 정렬합니다.
상당히 편리하게 사용이 가능하며, 이러한 예제들은 기본적으로 STL에서 제공하는 함수들을 사용할 때 이용이 가능합니다.
'개발 > C++' 카테고리의 다른 글
2. C++ DLL을 C#에서 이용하기 (0) | 2023.01.31 |
---|---|
1. VS 2019에서 C++ 프로젝트를 DLL로 빌드하기 (0) | 2023.01.31 |
C++20 신규 기능 정리 (0) | 2023.01.25 |
Boost Geometry 자주 사용하는 함수 정리 1편 (0) | 2022.11.02 |
std::unordered_map 정렬하기 (0) | 2022.10.06 |