해결된 질문
작성
·
177
0
안녕하세요
algorithm 강의와 람다 강의를 듣고 이해가 안되는 점이 있어 질문드립니다.
1번 질문)
algorithm 강의 29:28 부분에
185번째 줄
bool operator()(int n)
이라고 되어있고
191번째줄
vector<int>::iterator it = std::remove_if(v.begin(),v.end(),IsOdd());
되어있는데
여기서 궁금한게 185번째 줄에는 IsOdd 객체의 bool operator()(int n) 함수가
매개변수 int n을 대입하도록 되어있는데
191번째 줄에는 IsOdd()만 되어있고 int n을 대입한 부분이 없는거 같은데
어떻게 컴파일러는 int n을 판단하는지 궁금합니다
------------------------------------------------------------------------
2번 질문)
람다 강의 18:23초 부분에
100번째 줄
auto findByItemLambda = [=](Item& item)
{
return item._itemId == itemId;
}
105번째 줄
auto findIt = std::find_if(v.begin(), v.end(), findByItemIdLambda);
라고 써져있는데
여기서 궁금한점이
100번째줄 람다의 매개변수인 Item& item을 전달해준 부분이
없는거 같은데 어떻게 105번째 줄에서 findByItemIdLambda만 전달해서
findByItemIdLambda의 람다함수의 매개변수인 Item& item을
어떻게 컴파일러가 알 수 있는지 궁금합니다
답변 2
1
1+2) 1, 2가 동일한 질문이네요.
Functor나 함수 포인터를 이용할 때의 장점은
실제 호출하는 시점을 뒤로 미룰 수 있다는 점인데요.
실제 remove_if 코드를 살펴보면,
마지막에 넘겨준 _Pred (IsOdd 혹은 findItemByLambda)을 if (!_Pred(*_UFirst)) 로 호출하는 것을 알 수 있습니다.
그리고 이 *_UFirst란, 첫 인자로 넘겨준 인자에 역참조를 한 것인데
첫 인자는 v.begin()이기 때문에 결과적으로 *(v.begin())은
vector<?>에서 ?타입입니다.
1번 질문에서는 vector<int>였으니 int 타입이고,
2번 질문에서는 vector<Item>이었으니 Item 타입입니다.
따라서 우리가 직접 int나 Item&을 넣어주진 않았지만,
템플릿 코드의 흐름상 자연스럽게 그렇게 호출이 된 것입니다.
참고로 두번째 케이스에서는 Item이 아니라 Item&을 인자로 받는 함수 타입을 만들어줬지만,
결과적으로 _Pred(*_UFirst))가 문법적으로 말이 되기만 하면 됩니다.
즉,
void TestFunc(Item& item) 함수가 있을 때
Item item;
TestFunc(item); 으로 사용하는 것이 100% 합법적이니 문법상 아무런 문제가 없습니다.
0