프로그래밍/C++

C++ Lambda

우대비 2022. 11. 10. 15:57
반응형

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를 사용할 때에는 꼭 변수명으로 기입하길 바람!

반응형
LIST

'프로그래밍 > 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