게임 개발/C++

[C++] 람다 함수 - 2. 활용

유행성바코드 2025. 3. 26. 20:33

목차

  • 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

 

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!