페이지

2014년 12월 22일 월요일

range-based for

range-based for (Visual Studio 2012부터 사용가능)

- Visual Basic/C#/C++ 의 for each 와 유사하나 더 편리하게 사용이 가능하다.
- STL Container들은 모두 지원한다.
- 개인적으로 만든 class에 사용하고 싶다면, ++, !=, * 연산이 있는 iterator를 구현하여 begin, end 함수를 통해 호출 할 수 있어야 한다.


std::
vector<CString> v { _T("John Snow"), _T("Luna Star"), _T("Orange Chakra") };

for
 (int i = 0; i < v.size(); i++) // for
{
    std::cout << v[i] << std::endl;
}
for each (CString s in v) // for each
{
    std::cout << s << std::endl;
}
 
for (auto a : v) // range-based for
{
   std::cout << a << std::endl;
}

 사용법은 아주 간단하다. for (auto a : v)와 같이 사용하면 된다. 왠만하면 직접 변수 Type을 적어주지 말고 auto를 사용해라. 본인이 직접 만든 class 이거나 해당 Contatiner에 대한 이해도가 높다면 굳이 말리진 않겠지만, 그렇지 않은 상태에서 auto를 사용하지 않는다면 성능 저하를 일으킬 수 있다.

std::unordered_map<intCString> mStr;
// Casting pair<const int, ATL::CString> to pair<int , ATL::CString>
for (std::pair<intCString> p: mStr)
{
   std::cout << "Key : " << p.first << " , Value : "<< p.second << std::endl;
}
for (auto t : mStr) // pair<const int, ATL::CString>
{
    std::cout << "Key : " << t.first << " , Value : "<< t.second << std::endl;
} 

 위 예제에서 unordered_map에서의 tuple 하나의 형태는 pair<const int, CString> 이다. int 앞에 const를 빼먹었다가는 서로 다른 형태의 pair 끼리 Casting 을 하고 복사를 하는 과정을 계속 반복해야 하므로 Casting 연산 시간, 복사에 필요한 임시 메모리 할당 및 해제 시간까지 다 감당해야 한다.

auto
 변수에 대하여 복사 연산이나 읽기 전용 등에 대한 제약을 걸어주는 방법은 간단하다.
for (auto &t : mStr); // Don't Copy
for (auto const t : mStr); // Can't Modify
for (auto const &t : mStr); // Don't Copy & Can't Modify 

 일반적인 C++ 문법 그대로니깐


더욱 자세한 설명를 보고 싶으면 아래 Site를 참조하면 된다. 물론 순수 100% 영어다.
http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html



댓글 없음:

댓글 쓰기