목차
- 01. Intro
- 02. 람다 함수
- STL 활용
- mutable 활용
- 03. 마무리
- 04. 연관 내용
01. Intro
오늘은 람다 함수를 활용해서 다양한 예시를 확인해 보겠습니다.
02. 람다 함수
vector 활용
STL의 vector에 있는 데이터를 정렬할 때, 람다 함수를 활용해 다양한 정렬을 진행할 수 있습니다.
vector와 algorithm 라이브러리의 sort 함수를 같이 사용합니다.
sort함수는 기본적으로 오름차순 정렬이므로, 오름차순을 적용할 때는 별도의 람다 함수가 필요하지 않습니다.
내림차순
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> nums = { 2, 5, 1, 4, 9, 6, 3, 7, 8, 0 };
// 내림차순 정렬
sort(nums.begin(), nums.end(), [](const int& a, const int& b)
{
return a > b;
});
for (const int& num : nums)
{
cout << num << " ";
}
cout << endl;
return 0;
}

위는 람다 함수를 통해 내림차순 한 결과입니다.
내림차순인 경우에는 람다 함수보다 greater<int>()를 사용하는 것이 더 편리합니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> nums = { 2, 5, 1, 4, 9, 6, 3, 7, 8, 0 };
// 내림차순 정렬
sort(nums.begin(), nums.end(), greater<int>());
for (const int& num : nums)
{
cout << num << " ";
}
cout << endl;
return 0;
}

다양한 조건문
람다 함수 내부에서 조건문을 활용하면, 다양한 조건을 기준으로 정렬할 수 있습니다.
아래 코드에서는 다음과 같은 규칙을 따르도록 작성했습니다.
1. 홀수가 짝수보다 앞
2. 홀수는 내림차순
3. 짝수는 오름차순
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> nums = { 2, 5, 1, 4, 9, 6, 3, 7, 8, 0 };
// 다양한 조건에 따라 정렬
sort(nums.begin(), nums.end(), [](const int& a, const int& b)
{
// 둘 다 홀수 : 내림차순
if (a % 2 == 1 && b % 2 == 1)
{
return a > b;
}
// 둘 중 하나 홀수 : 홀수가 앞으로
if (a % 2 == 1 || b % 2 == 1)
{
// a 홀수, b 짝수 : true -> a가 앞으로
// a 짝수, b 홀수 : false -> b가 앞으로
return a % 2 == 1;
}
// 둘 다 짝수 : 오름차순
return a < b;
});
for (const int& num : nums)
{
cout << num << " ";
}
cout << endl;
return 0;
}

구조체의 특정 멤버 변수
구조체의 특정 멤버 변수를 정렬에 대한 기준으로 사용할 수 있습니다.
아래 코드는 구조체의 멤버 변수가 여러 개일 때, 하나의 멤버 변수를 기준으로만 정렬했습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Loc
{
int x = 0;
int y = 0;
};
int main()
{
srand(static_cast<unsigned int>(time(nullptr)));
vector<Loc> locs;
// 0~99까지 랜덤 좌표를 가진 10개 추가 및 출력
for (int i = 0; i < 10; i++)
{
locs.push_back({ rand() % 100, rand() % 100 });
cout << locs[i].y << " " << locs[i].x << endl;
}
// y좌표 기준 내림차순
sort(locs.begin(), locs.end(), [](const Loc& a, const Loc& b)
{
return a.y > b.y;
});
cout << "=========== 정렬 후 ===========" << endl;
for (int i = 0; i < 10; i++)
{
cout << locs[i].y << " " << locs[i].x << endl;
}
return 0;
}

mutable 활용
값 캡처[=]를 캡처 모드로 사용하는 경우, 외부 변수는 모두 복사가 됩니다.
이때, 단순히 복사만 되는 것이 아니라, const로 처리되어 람다 함수 내부에서 변경할 수 없습니다.
람다 함수 내부에서도 값을 변경하려면, mutable 키워드와 함께 사용해야 합니다.
그리고, 람다 함수 내부에서 사용한 외부 변수는 별개로 취급됩니다.
즉, 람다 함수 내부에서 외부 변수의 값을 변경해도, 원본에는 영향을 끼치지 않습니다.
#include <iostream>
using namespace std;
int main()
{
int num = 10;
auto printNum = [=]() mutable
{
num += 5;
cout << "num : " << num << "\n";
};
printNum();
cout << "num : " << num << "\n";
return 0;
}

위 코드를 실행하면, 람다 함수 내부에서 외부 변수인 num 값을 변경했지만, 람다 함수 내에서만 적용되고 외부에서는 변경점이 적용되지 않는 것을 확인할 수 있습니다.
- mutable 키워드를 붙이지 않을 때

외부 변수 num은 복사할 때 상수화가 되므로, 변경할 수 없어 컴파일 에러가 발생합니다.
- 참조 캡처[&]를 사용할 때
참조 캡처는 외부 변수를 참조하는 것이므로, 람다 함수 내부에서 변경한 값이 외부에도 적용됩니다.
#include <iostream>
using namespace std;
int main()
{
int num = 10;
auto printNum = [&]()
{
num += 5;
cout << "num : " << num << "\n";
};
printNum();
cout << "num : " << num << "\n";
return 0;
}

03. 마무리
오늘 포스팅 글을 끝으로 람다 함수에 관한 내용을 마치겠습니다.
함수 객체로 람다 함수를 활용하는 부분도 있지만, 이는 추후에 함수 객체를 다루고 난 후에 알아보겠습니다.
04. 연관 내용
- [C++] 람다 함수 - 1. 기본 형태
[C++] 람다 함수 - 1. 기본 형태
목차01. Intro02. 람다 함수문법캡처 모드반환형03. 마무리04. 연관 내용01. Intro오늘은 [람다 함수]의 기본 형태에 대해 알아보겠습니다. 02. 람다 함수람다 함수는 이름 없이 함수를 정의하고 이를
epidemic-barcode.tistory.com
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 연산자 오버로딩 - 2. 사칙 연산자 (0) | 2025.03.31 |
|---|---|
| [C++] 연산자 오버로딩 - 1. 전위형 / 후위형 증감 연산자 (0) | 2025.03.30 |
| [C++] 람다 함수 - 1. 기본 형태 (0) | 2025.03.25 |
| [C++] 동적 할당 - new/delete (0) | 2025.03.21 |
| [C++] 중괄호 초기화 - 2. initializer_list (0) | 2025.03.20 |