코드 여행자

C++11] Range Based for loop 사용법 본문

C++ 11, 14, 17

C++11] Range Based for loop 사용법

알 수 없는 사용자 2019. 11. 18. 23:43

기존의 C++ 에서 for loop 를 사용할 때는 아래와 같이 초기값, 조건식, 변화값을 주어야 했습니다.


코드

    std::vector<int>values = {1,3,5,7,9};
    for(int i=0; i < values.size(); i++) {
        cout << values.at(i) << '  ';
    }

실행결과 

1 3 5 7 9 




이러한 방식은 특정한 변화값에 정의가 없이 vector 와 배열과 같은 index 가 하나씩 증가하는 경우에 불편하게 사용되었는데요, 

C++11 부터 범위 기반 for 문 (Range based for loop) 을 제공하여 이런 경우에 좀 더 편리하게 코딩할 수 있게 되었습니다. :)


위의 예제를 범위 기반 for 문으로 변경하면 다음과 같이 사용할 수 있습니다.


코드

    std::vector<int> values = {1,3,5,7,9};  
    for(int value : values) {
        cout << value << ' ';
    }


실행 결과는 일반적인 for 문을 사용할 때와 동일하지만, 조건식과 변화값을 고민할 필요 없이 범위가 있는 자료형을 넣어 주면 

앞의 value 에 자동으로 하나씩 할당이 되고, 범위가 끝나면 for 문이 종료되게 됩니다. 


앞의 value 값에 위와 같이 자료형을 정의해서 사용할 수도 있지만, Range based for loop 를 사용할 때는 vector 나 배열, Map 등의 복잡한 형태의 값을 받기 위해 auto keyword 를 주로 사용 합니다. 



코드

   std::map<string, string> strValues = {{"one", "first"}, {"two", "second"}, {"three", "third"}};
    for(auto strValue : strValues) {
        cout << strValue.first << ' ' << strValue.second << std::endl;

실행결과

one first

three third
two second



map 자료형을 받지만 auto keyword 를 사용하면 굳이 자료형을 다 적어주지 않아도 간단하게 사용할 수 있습니다. 


추가로 range based for loop 에서는 참조 형태도 지원 합니다. 

아래와 같이 values 값을 item 변수에 하나씩 복사하여 그 값에 1을 더할 경우, values 의 값은 변하지 않습니다. 

values vector의 각각의 요소가 item 에 복사가 되고, 실제로 1이 더해지는 변수는 item 변수이기 때문입니다. 


코드

    std::vector<int> values = {1,3,5,7,9};  
    for(auto item : values) {
        item += 1;
    }
    for(auto value : values) {
        cout << value << ' ';
    }

실행결과

1 3 5 7 9 


직접 values 의 값을 변경하고 싶은 경우나, values 의 값이 너무 커서 (위의 예제는 int 이지만 객체를 복사한다고 가정 했을 때), 복사비용이 너무 커질 때

아래와 같이 참조변수를 사용할 수 있습니다. 


코드

    std::vector<int> values = {1,3,5,7,9};  
    for(auto& item : values) {
        item += 1;
    }
    for(auto value : values) {
        cout << value << ' ';
    }

실행결과

2 4 6 8 10  



간단하게 auto 변수에 &를 붙여주게 되면 참조로 인식되고 실제 values 에 저장되어있는 값을 변경하게 됩니다. 

item 에 1을 더한 후, values 값을 찍어보면 값이 변한 것을 확인할 수 있습니다.




'C++ 11, 14, 17' 카테고리의 다른 글

C++11] auto keyword 기본 및 활용  (0) 2019.10.27
Comments