<기본 정리> 범위 기반 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 라이브러리를 이용해야 합니다. |
일단 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 의 차이 (11) | 2019.01.26 |