for 문은 초기값과 반복조건 그리고 증감(감소)문으로 구성되어 있습니다. C++11에서는 다소 복잡한 for 문 대신 보다 간결한 범위 기반의 for 문을 지원합니다. 아래의 예를 살펴보도록 하겠습니다.
#include "stdafx.h" #include#include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector v; for(int i=0; i<10; ++i) { v.push_back(i); } for(vector ::const_iterator it = v.cbegin(); it != v.cend(); ++it) { cout << *it << endl; } return 0; }
15번 코드를 보면 for문에 대한 초기값, 조건값, 증감문으로 구성되어 있는 것을 볼 수 있습니다. 이를 범위 기반의 for 문을 사용하여 다음과 같이 단순하게 코드를 구성할 수 있습니다.
#include "stdafx.h" #include#include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector v; for(int i=0; i<10; ++i) { v.push_back(i); } for(int i: v) { cout << i << endl; } return 0; }
변경된 15번째 줄 코드를 보면 오직 반복하여 얻는 값에 대한 정의만 있습니다. 매우 직관적이라는 것과 반복에 대한 범위를 고민할 필요가 없다는 것을 알 수 있습니다. 이 범위 기반의 for문에 대해 한가지 더 살펴본다면 바로 반복에 대한 참조값의 사용입니다. 위의 코드는 참조값이 아니므로 반복문 안에서 값에 대해 변경할 경우 원본은 변경되지 않는다는 것입니다. 원본의 변경이 필요할 경우 다음과 같이 참조값을 이용하여 for 문을 구성할 수 있습니다.
#include "stdafx.h" #include#include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector v; for(int i=0; i<10; ++i) { v.push_back(i); } for(int &i: v) { i*= 2; } for(int i: v) { cout << i << endl; } return 0; }
15번 코드에서 int &i와 같은 참조 타입을 사용하였으므로 원본값을 변경할 수 있습니다. 위의 코드는 C++11에서 새롭게 정의되어 지원되는 auto 기능을 이용하여 다음처럼 동일한 기능으로 변경할 수 있습니다.
#include "stdafx.h" #include#include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector v; for(auto i=0; i<10; ++i) { v.push_back(i); } for(auto &i: v) { i *= 2; } for(auto i: v) { cout << i << endl; } return 0; }
한번 정의된 데이터에 대해서 이후에 굳이 그 타입을 찾아 입력할 필요없이 auto 키워드를 통해 매우 직관적이고 꼭 필요한 사고(Thinking)만을 할 수 있도록 지원하고 있습니다.