Lambda
람다는 쉽게 말해서 "함수를 인자로 보낼때"
lvalue로 "생성 되어있는 함수"를 보내는 것이 아닌
rvalue를 "즉석에서 만들어 보내는것"
Lambda 사용법
-[캡쳐](매개변수){함수 내용}
auto findIt3= std::find_if(v.begin(), v.end(), [&itemId](Item& item) { return item._itemId == itemId;});
Lambda.. 왜써?
struct FindItem
{
FindItem(int itemId, Rarity rarity, ItemType type) : _itemId(itemId)
{
}
bool operator()(Item& item)
{
return item._itemId == _itemId
}
int _itemId;
};
find_if와 같이 함수를 인자로 보내는 경우가 생각보다 많은데
이때 Lambda를 모든다면 보통 함수객체로 보내는 경우가 많음
auto findIt2 = std::find_if(v.begin(), v.end(), FindItem(itemId));
위처럼 함수객체를 인자로 보내면 깔끔해서 좋긴하지만
함수객체를 만드는데도 너무 오래걸리고,
이 함수객체가 도대체 어떤 역할을 하는지도 바로 알 수 없고
한번 쓰고 말거여서 좀 아깝기도 하고..
여러모로 불편한 점이 많음..!
이때 Lambda를 쓴다면..!?
auto findIt3= std::find_if(v.begin(), v.end(), [](Item& item) { return item._itemId == 3;});
크으~ 이렇게 직관적이게 만들 수 있음
Lambda 캡쳐
lambda캡쳐는 "두 종류가 있음" 바로 => [ = ], [ & ]
우선 "=는 복사"를 뜻하고 "&는 참조"를 뜻함
Lambda같은 경우에는 함수처럼 지역을 지정해서 만들어지는게 아니기 때문에
"같은 지역에 있는 변수들을 사용 할 수가 있는데"
int itemId = 4;
auto findIt = std::find_if(v.begin(), v.end(), [&](Item& item){return item._itemId == itemId;});
[ ] 안에 &를 넣으면 Lambda에서 사용하는 "모든 변수(itemId)를 참조형식"으로 쓴다는 것이고
[ ] 안에 =를 넣으면 "값만 복사해서 사용"한다는 의미가 됨
예를 들자면
int itemId = 4;
auto FindByItemIdLanbda = [=](Item& item)
{
return item._itemId == itemId;
};
itemId = 1;
auto findIt = std::find_if(v.begin(), v.end(), FindByItemIdLanbda);
위와 같은 상황에서 [=]로 하면 itemId의 값인 4를 복사해서 넣었기 때문에 4로 실행이 되고
[&]를 넣었다면 itemId 변수를 참조하기 때문에 1로 실행이 된다는 거
Lambda 캡쳐 정석
int itemId = 4;
Rarity rarity = Rarity::Common;
ItemType type = ItemType::Consumable;
auto FindByItemIdLanbda = [&itemId, rarity, type](Item& item)
{
return item._itemId == itemId && item._rarity == rarity && item._type == type;
};
[ ] 안에 = , &만 넣는게 아니라 변수명을 기입할 수도 있는데
변수명만 넣으면 복사타입, &를 붙이면 참조타입으로 인식됨
이런식으로 변수명을 넣는 방법이 직관성도 좋기 때문에
Lambda를 사용할 때에는 꼭 변수명으로 기입하길 바람!
'프로그래밍 > C++' 카테고리의 다른 글
LNK2019, LNK1120 해결법 (0) | 2022.12.15 |
---|---|
스마트 포인터 (0) | 2022.11.10 |
전달 참조(보편 참조)와 forward (0) | 2022.11.09 |
오른값(rvalue)과 이동 대입 연산자 (0) | 2022.11.09 |
using, typedef (0) | 2022.11.09 |