Visual Studio 2010 공식 팀 블로그 @vsts2010

Posted by 흥배

C++에서의 람다 사용 법

 

람다 사용 방법은 아래와 같습니다.

[](파라메터) { }

 

int 값에 50을 더한 후 반환하는 람다 함수 

[](int x) { return x + 50; }

 

위 방법은 반환 값의 type“x+ 50”의 값의 type으로 추정되어 반환됩니다.

만약 반환 값 type을 지정하고 싶다면

 

[](int x) -> int { return x + 50; }

라고 하면 됩니다. 그리고 참고로 반환하지 않을 것이면 반환하지 않아도 됩니다.

또한 클로져를 사용하면 “[]” 사이에 참조를 넘길 수도 있습니다.

 

그럼 람다 사용 방법을 좀 더 알기 쉽도록 여러 가지 사용 예를 보여 드리겠습니다.

 

 

 

STL find_if에서 람다 사용

 

그럼 <Code 2>(첫  번째 글)에서 펑터를 정의하여 사용했던 것을 람다를 사용하는 것으로 바꾸어 보겠습니다.

 

< Code 3. >

#include <iostream>

#include <algorithm>

#include <vector>

 

using namespace std;

 

class User

{

public:

           User() : m_bDie(false) {}

           ~User() {}

 

           void SetIndex(int index) { m_Index = index; }

           int       GetIndex() { return m_Index; }

           void SetDie() { m_bDie = true; }

           bool IsDie() { return m_bDie; }

 

private:

           int m_Index;

           bool m_bDie;

};

 

int main()

{

           vector< User > Users;

           User tUser1;      tUser1.SetIndex(1);         Users.push_back(tUser1);

           User tUser2;      tUser2.SetIndex(2);         tUser2.SetDie();   Users.push_back(tUser2);

           User tUser3;      tUser3.SetIndex(3);         Users.push_back(tUser3);

 

           vector< User >::iterator Iter;

           Iter = find_if( Users.begin(), Users.end(), [](User& tUser) -> bool { return true == tUser.IsDie(); } );

           cout << "found Die User Index : " << Iter->GetIndex() << endl;

 

           return 0;

}

 

< 결과 >



find_if 알고리즘을 사용하여 죽은 유저를 찾기 위해서 <Code 2>에서는 펑터를 정의한 후 사용하였지만

struct FindDieUser

{

           bool operator()  (User& tUser) const { return tUser.IsDie(); }

};

Iter = find_if( Users.begin(), Users.end(), FindDieUser() );


< Code 3>는 람다를 사용하여 한 줄로 간단하게 끝내버렸습니다.

Iter = find_if( Users.begin(), Users.end(), [](User& tUser) -> bool { return true == tUser.IsDie(); } );

 

람다 덕분에 STL의 알고리즘 사용이 아주 편리해졌습니다.

 

람다가 생겨서 이전과 다르게 C++의 표현력이 이전보다 훨씬 더 좋아졌습니다.

참고로 VC++ 10에서는 병렬 패턴 프로그래밍(PPL) 이라는 것이 새로 추가 되었습니다. 이 라이브러리는 템플릿으로 만들어진 것으로 람다가 많이 사용 되었다고 합니다.

( PPL에 대해서는 정재원님이 포스팅하고 있는 2008 PDC에서의 PPL 강연 동영상을 꼭 보시기를 권합니다. 그리고 저도 곧 PPL 관련 글을 포스팅할 예정입니다. )


이번 회는 간단하게 C++에서 람다를 어떻게 사용하는지 이야기했습니다. 다음에는 클로져 사용에 대해서 이야기 하겠습니다.

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요