struct compareString
{
bool operator()(string a, string b) const {return a+b > b+a;}
};
string solution(vector<int> numbers)
{
...
sort(numbers_string.begin(), numbers_string.end(), compareString);
...
}
코테 풀이 중 algorithm 헤더의 sort 함수에 커스텀한 compare 인자를 넣으려고 했는데, 아래와 같은 오류가 발생했다.
/solution0.cpp:22:56: error: 'compareString' does not refer to a value
sort(numbers_string.begin(), numbers_string.end(), compareString);
^
/solution0.cpp:7:8: note: declared here
struct compareString
^
1 error generated.
오류를 직역하자면, 'compareString'은 값을 참조하지 않는다는 뜻이다.
위 코드에서 compareString은 구조체의 이름이지, 객체가 아니다.
하지만 compare 인자는 class이기 때문에 객체를 넣어주어야 한다.
=> 즉, 구조체든 함수든 객체를 생성하여 넣어주어야 한다.
struct compareString
{
bool operator()(string a, string b) const {return a+b > b+a;}
};
string solution(vector<int> numbers)
{
...
sort(numbers_string.begin(), numbers_string.end(), compareString());
...
}
기본 생성자로 임시 객체를 생성하여 인자로 넣어준다.
이때, compareString 구조체는 함수처럼 동작하는 객체이기에 functor이다.
struct
{
bool operator()(string a, string b) const {return a+b > b+a;}
}compareString;
string solution(vector<int> numbers)
{
...
sort(numbers_string.begin(), numbers_string.end(), compareString);
...
}
익명 구조체 정의와 객체 생성을 동시에 한 뒤, 이를 인자로 전달한다.
string solution(vector<int> numbers)
{
...
sort(numbers_string.begin(), numbers_string.end(),
[](const string& a, const string& b){ return a+b > b+a; };
...
}
익명 함수 객체인 람다를 사용하여 바로 compare 인자로 전달한다.
람다가 훨씬 가독성이 좋은데, 왜 굳이 functor을 써야할까? 의문이 들었다.
게다가 std::function도 있는데, 왜 functor 라는게 있는가 싶어서 짱피티한테 물었더니 아래와 같이 대답해주더이다.