문제를 풀다가, 람다 함수에 대해 제대로 알고 있다고 생각했는데 아니었다는 것을 깨달았다. 그래서 기록해본다.
람다 함수란 익명 함수(이름이 없는 함수)로, 코드에서 간단히 함수 기능을 정의하고 사용하는 함수이다.
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]은 람다 함수 외부에서 정의된 변수 n을 람다 함수 안에서 사용할 수 있도록 캡처하는 것을 의미한다.
만약 [&n]이라고 썼다면 n을 참조(reference)로 캡처해서, 외부에서 n의 값을 수정할 수 있게 만든다.
이 부분은 람다 함수에 전달될 매개변수들이다.
여기서는 두 개의 문자열 a와 b를 인자로 받아 비교하는 함수이다.
const string &a와 const string &b는 문자열을 상수 참조로 받아와, 원본 값을 수정하지 않으면서 성능을 최적화한다 (복사 대신 참조만 사용).
함수의 반환형을 명시할 수 있다. 여기서는 반환형을 생략하고 있는데, 이 경우 컴파일러가 자동으로 반환형을 추론한다.
이 람다 함수는 bool을 반환한다 (a < b 또는 a[n] < b[n]의 결과는 bool이기 때문).
람다 함수가 실제로 수행할 코드이다.
이 함수는 문자열 a와 b의 n번째 문자를 비교하거나, 두 문자열의 n번째 문자가 같으면 전체 문자열을 사전순으로 비교한다.
이 람다 함수는 sort 함수에 전달되어 문자열을 원하는 방식으로 정렬하는 데 사용된다.