본문으로 바로가기

C++11) 범위 기반 for문 (loop)

category C++/Modern 2019. 1. 27. 21:43

<기본 정리>


범위 기반 for문 ( loop ) 는 C++11에서 도입되었습니다.

배열 및 컨테이너 ( 혹은 사용자 정의 타입에 처음과 끝을 정의한다면 ) 에 사용가능합니다.


기본 문법

for (Type elem : container)


<범위기반 for문의 사용 예제>


 <결과>


범위기반 for문은 a의 복사형을 받기 때문에, 컨테이너 (혹은 배열) 의 내용물을 변경한다면 변경되지 않습니다.

그러나 인수를 참조형으로 사용한다면, 변경할 수 있습니다.


<범위기반 for 문으로 배열의 값을 변경하고, 다시 출력하는 소스>


<역시나 배열 안의 값이 변경되지 않았다!>



<하지만 참조형으로 받는다면>


<값이 변경 되었다!>


함수와 마찬가지로, 참조형으로 원소를 받으면, 주소를 넘기는 것이기 때문에 용량이 큰 컨테이너나 사용자 정의 타입에 대해 효과적입니다.

만약 수정을 원하지 않을 경우 상수로 바꾸시면 됩니다. (const int& i 같이)


또한 컨테이너 타입 ( vector, list ...) 에 사용 가능합니다.

<vector 컨테이너에 범위 기반 for문을 사용한 소스>

( 다음에 auto keyword 에 대한 설명글도 작성이 되어있습니다. )


<출력>


역시나 vector의 원소들에 대한 값 변경을 원하신다면 참조형으로 받아야 합니다.

<심화 내용>


범위 기반 for 문을 사용하려면 begin 함수와 end 함수가 구현이 돼있어야 합니다.

기본 컨테이너들 (vector, list...) 에 대해선 이미 구현이 돼있지만 사용자 정의 타입에서는 구현을 해주셔야 사용 가능합니다.


<사용자 정의타입의 링크드 리스트에 범위 기반 for문을 적용하는 모습>


기본적으로 begin, end, 그리고 증가 연산자를 구현하여야 합니다.

만약 사용자 정의 타입에 거꾸로 출력을 원하신다면, 래퍼를 만들어주시거나 boost 라이브러리를 이용해야 합니다.







reversion_wrapper에 대한 부가설명을 하자면 

일단 reserve에 들어가면 reserve 함수는 reversion_wrapper의 생성자를 호출합니다.

(이때 초기화 리스트를 사용합니다. 이유는 함수의 return 형에 중괄호가 돼있기 때문에)

그리고 reversion_wrapper는 T& 형 타입의 변수를 뱉어 냅니다.(이때 T형은 initializer_list<int> 형입니다)


'C++ > Modern' 카테고리의 다른 글

C++11) std::forward (perfect forwarding)  (4) 2019.02.02
c++11) std::move (move semantics)  (2) 2019.02.01
C++11) auto 키워드  (0) 2019.01.30
C++11) 초기화 리스트(initialize_list)  (2) 2019.01.27
emplace_back 과 push_back 의 차이  (10) 2019.01.26