프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] STL Algorithms : 람다식 (77강)

순정법사 2024.03.28

A. STL Algorithms

1. 람다식

a. 람다식이란?

🌟 익명 함수를 생성하는데 사용되는 간결한 문법

 

  • 함수 객체를 만드는데 있어서 편의성과 가독성을 높여줌
  • 함수나 함수 포인터가 필요한 곳에서 사용(우선순위 큐에서 predicate 넣어줄 때, 인벤토리 등 을 할때 사용)
  • 주로 STL 알고리즘과 함께 사용되어 익명 함수를 표현하는 용도
  • C++11부터 도입

 

b. 기본 구문

📘 문법

[capture list] (parameters) -> return_type { 
    // 함수 본문 
}

 

  • capture list: 람다식에서 사용되는 외부 변수를 캡처. 람다식 내부에서 외부 변수를 사용할 때, 이 변수들을 캡처해야 함
  • parameters: 람다 함수의 매개변수. 람다식 내에서 사용될 수도 있고, 비워둘 수도 있음
  • return_type: 반환 유형. 자동으로 추론되면 ->와 반환 유형을 생략할 수 있음
  • {}: 함수 본문을 감싸는 중괄호

 

⏳ 예제

#include <iostream>

int main() {
    // 간단한 람다식 예시
    auto add = [](int a, int b) -> int { return a + b; };
    std::cout << add(3, 4) << std::endl; // 출력: 7
    
    // 외부 변수 캡처 예시
    int x = 10;
    auto func = [&x]() { std::cout << "x: " << x << std::endl; };
    func(); // 출력: x: 10
    
    // 매개변수를 사용하지 않는 람다식
    auto hello = []() { std::cout << "Hello, Lambda!" << std::endl; };
    hello(); // 출력: Hello, Lambda!
    
    return 0;
}

 

c. Capture List

🌟 외부 변수를 람다식 내에서 사용할 때 그 변수들을 어떻게 캡처할지를 결정

 

  • [ ]: 아무 변수도 캡처 X
  • [var]: 특정 변수 var를 값으로 캡처 ex) [aaa]
  • [&var]: 특정 변수 var를 레퍼런스로 캡처 ex) [&aaa]
  • [=]: 모든 변수를 값으로 캡처
  • [&]: 모든 변수를 레퍼런스로 캡처
  • [var, var, ,,,, var] : 특정 변수들을 여러개 지정

 

만약 주소값이 없다면 문제가 됨 ➡ 유의해서 사용해야 함!!

 

복사할 때 모든게 복사되는게 아니라 

주소를 복사한다는 것 자체가 어떻게 보면 참조값을 넘긴다는 거랑 똑같음 

 

= 는 this

 

d. 캡처 모드

🌟 외부 변수가 람다식 내에서 어떻게 변경될지를 결정

 

  • mutable: 람다식 내에서 캡처된 변수를 변경할 수 있도록 함
  • constexpr: 람다식 내에서 constexpr 함수로 사용할 수 있도록 함 (희귀)

 

e. 캡처 초기화 

캡처된 변수들은 초기화, 복사, 레퍼런스로 캡처될 수 있음

 

⏳ 예제

#include <iostream>

int main() {
    int a = 5;
    int b = 10;

    auto func1 = [a, &b]() mutable {
        // a는 값으로 캡처되어 읽기 전용
        // b는 레퍼런스로 캡처되어 수정 가능
        a = 100; // 에러: a는 값으로 캡처되어서 수정할 수 없음
        b = 200; // 유효: b는 레퍼런스로 캡처되어서 수정 가능
    };

    auto func2 = [=, &b]() mutable {
        // 모든 변수가 값으로 캡처되고 b만 레퍼런스로 캡처됨
        a = 100; // 에러: a는 값으로 캡처되어서 수정할 수 없음
        b = 200; // 유효: b는 레퍼런스로 캡처되어서 수정 가능
    };

    func1();
    std::cout << "a after func1: " << a << std::endl; // 출력: 5
    std::cout << "b after func1: " << b << std::endl; // 출력: 200

    func2();
    std::cout << "a after func2: " << a << std::endl; // 출력: 5
    std::cout << "b after func2: " << b << std::endl; // 출력: 200

    return 0;
}

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com