C++의 ranged for loop

Brie·2024년 4월 17일
0

C++

목록 보기
8/9

개요

C++의 ranged for loop는 C++11부터 사용 가능하며, 컨테이너에 있는 요소들을 반복적으로 접근할 때 사용되는 편리한 문법이다. 일반적으로 배열, 벡터, 리스트 등의 컨테이너에서 사용된다. 이 문법을 사용하면 반복자(iterator)나 인덱스를 명시적으로 다루지 않고도 컨테이너의 모든 요소를 순회할 수 있다.

예제

예제에서 for (int num : numbers)는 벡터 numbers의 모든 요소를 순회하며 각 요소를 num에 할당하여 반복 작업을 수행한다.

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 벡터의 모든 요소에 대해 반복적으로 작업을 수행
    for (int num : numbers) {
        std::cout << num << " ";
    }

    return 0;
}

참조인가 복사인가?

C++에서 범위 기반 for 문(ranged for loop)을 사용할 때, 각 요소가 참조인지 아니면 복사본인지는 사용자가 지정한 방식에 따라 달라진다.
기본적으로 범위 기반 for 문은 컨테이너의 각 요소를 복사본으로 처리한다. 그러나 요소를 참조로 처리하고 싶다면, 반복 변수를 참조 타입으로 명시해야 한다.

std::vector<int> vec = {1, 2, 3, 4, 5};

for (int i : vec) {
    i = 10;  // 이 코드는 vec의 각 요소에 영향을 주지 않음
}

위 코드에서 i는 vec의 각 요소의 복사본이며, i의 값을 변경해도 원래 vec의 요소에는 영향을 주지 않는다.

반면에, 요소를 참조로 처리하여 원본 데이터에 영향을 주고자 한다면 다음과 같이 참조자(&)를 사용해야 한다.

for (int &i : vec) {
    i = 10;  // 이 코드는 vec의 각 요소를 10으로 변경함
}

이 경우 ivec의 각 요소에 대한 참조가 되므로, i의 값을 변경하면 vec의 해당 요소도 변경된다.

또한 const 참조를 사용하여 요소들을 수정하지 않고 효율적으로 접근할 수도 있다.

for (const int &i : vec) {
    std::cout << i << " ";  // vec의 각 요소를 읽기만 할 때 사용
}

이는 복사본을 생성하지 않고 원본 컨테이너의 요소들을 직접 참조하기 때문에 효율적이다.
이로 인해 추가적인 메모리 할당이 발생하지 않으며, 특히 컨테이너의 요소가 크거나 복사 비용이 높은 객체일 경우에 이점이 더욱 크다.
그러나 int와 같은 작은 기본 타입의 경우에는 복사 비용이 그리 중요하지 않을 수 있으며, 복사를 통해 원본 데이터 보호가 가능해지는 장점도 있다고 볼 수도 있다.

0개의 댓글