C++에서의 람다 사용 법
람다 사용 방법은 아래와 같습니다.
int 값에 50을 더한 후 반환하는 람다 함수
위 방법은 반환 값의 type이 “x+ 50”의 값의 type으로 추정되어 반환됩니다.
만약 반환 값 type을 지정하고 싶다면
라고 하면 됩니다. 그리고 참고로 반환하지 않을 것이면 반환하지 않아도 됩니다.
또한 클로져를 사용하면 “[]” 사이에 참조를 넘길 수도 있습니다.
그럼 람다 사용 방법을 좀 더 알기 쉽도록 여러 가지 사용 예를 보여 드리겠습니다.
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>는 람다를 사용하여 한 줄로 간단하게 끝내버렸습니다.
람다 덕분에 STL의 알고리즘 사용이 아주 편리해졌습니다.
람다가 생겨서 이전과 다르게 C++의 표현력이 이전보다 훨씬 더 좋아졌습니다.
참고로 VC++ 10에서는 병렬 패턴 프로그래밍(PPL) 이라는 것이 새로 추가 되었습니다. 이 라이브러리는 템플릿으로 만들어진 것으로 람다가 많이 사용 되었다고 합니다.
( PPL에 대해서는 정재원님이 포스팅하고 있는 2008 PDC에서의 PPL 강연 동영상을 꼭 보시기를 권합니다. 그리고 저도 곧 PPL 관련 글을 포스팅할 예정입니다. )
이번 회는 간단하게 C++에서 람다를 어떻게 사용하는지 이야기했습니다. 다음에는 클로져 사용에 대해서 이야기 하겠습니다.
'C++0x' 카테고리의 다른 글
| [VC++] 13. Lambda - 네 번째 (3) | 2009/06/23 |
|---|---|
| [VC++] 12. Lambda - 세 번째 (0) | 2009/06/16 |
| [VC++] 11. Lambda - 두 번째 (0) | 2009/06/09 |
| [VC++] 9. Lambda ( 람다 ) - 첫 번째 (4) | 2009/06/02 |
| [VC++] 8. 우측 값 참조( RValue Reference ) – 다섯 번째 (3) | 2009/05/26 |
| [VC++] 7. 우측 값 참조( RValue Reference ) - 네 번째 (3) | 2009/05/20 |




댓글을 달아 주세요