람다 함수

Subin·2024년 9월 20일

Algorithm

목록 보기
39/69

문제를 풀다가, 람다 함수에 대해 제대로 알고 있다고 생각했는데 아니었다는 것을 깨달았다. 그래서 기록해본다.


람다 함수란 익명 함수(이름이 없는 함수)로, 코드에서 간단히 함수 기능을 정의하고 사용하는 함수이다.
vector<pair<char, string>>을 람다 함수를 이용해서 푸는 문제였는데,

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<string> solution(vector<string> strings, int n) {
    // n번째 문자를 기준으로 정렬하기 위해 문자열과 그 문자의 pair를 만듦
    sort(strings.begin(), strings.end(), [n](const string &a, const string &b) {
        // n번째 문자가 같으면 사전순으로 정렬
        if (a[n] == b[n]) {
            return a < b;
        }
        // n번째 문자를 기준으로 정렬
        return a[n] < b[n];
    });

    return strings; // 정렬된 결과 반환
}

여기에서, [n](const string &a, const string &b) 의 의미를 정확히 이해하지 못했었다.
찾아보니,
[n](const string &a, const string &b)는 람다 함수를 정의하는 구문이었다.



람다 함수는 다음과 같이 정의되는데,
[capture](parameters) -> return_type {
    // function body
};

[n]: 캡처(capture) 리스트

람다 함수 외부에 있는 변수를 람다 함수 내부에서 사용할 수 있도록 "캡처"하는 리스트이다.
[n]은 람다 함수 외부에서 정의된 변수 n을 람다 함수 안에서 사용할 수 있도록 캡처하는 것을 의미한다.
만약 [&n]이라고 썼다면 n을 참조(reference)로 캡처해서, 외부에서 n의 값을 수정할 수 있게 만든다.

(const string &a, const string &b): 매개변수

이 부분은 람다 함수에 전달될 매개변수들이다.
여기서는 두 개의 문자열 a와 b를 인자로 받아 비교하는 함수이다.
const string &aconst string &b는 문자열을 상수 참조로 받아와, 원본 값을 수정하지 않으면서 성능을 최적화한다 (복사 대신 참조만 사용).

-> return_type: 반환형 (생략 가능)

함수의 반환형을 명시할 수 있다. 여기서는 반환형을 생략하고 있는데, 이 경우 컴파일러가 자동으로 반환형을 추론한다.
이 람다 함수는 bool을 반환한다 (a < b 또는 a[n] < b[n]의 결과는 bool이기 때문).

{ ... }: 함수 본문

람다 함수가 실제로 수행할 코드이다.
이 함수는 문자열 a와 b의 n번째 문자를 비교하거나, 두 문자열의 n번째 문자가 같으면 전체 문자열을 사전순으로 비교한다.


이 람다 함수는 sort 함수에 전달되어 문자열을 원하는 방식으로 정렬하는 데 사용된다.

profile
성장하며 꿈꾸는 삶을 살아가고 있는 대학생입니다😊

0개의 댓글