[C++/C]Range based for 와 Auto 키워드

2023. 8. 2. 00:27프로그래밍 언어/C++\C

Range based for

Range based for문은 알아서 데이터 리스트를 순회하는 for 반복문이다. 일반적인 for문과 달리 사용할 때 순회할 리스트의 index는 넘겨주지 않고 for문 안에서도 사용하지 않는다. 사용법은 예제로 보자.

#include <iostream>
using namespace std;

int main()
{
    int arr[] = {0, 1, 2, 3, 4, 5};
    for (int i : arr)
    {
        i += 1;
        cout << i << ' '; //출력값 1 2 3 4 5 6
    }
    cout << arr[0]; //출력값 0
}

 

자동으로 i에 arr 배열의 값이 차례로 얕은 복사로 할당된다. 따라서 for문이 끝나고 arr [0]의 값을 출력하면 1이 아닌 0이 출력된다.

reference를 이용하여 for문을 사용할 수도 있다. reference를 이용하면 복사 비용도 줄고 배열의 원래 값을 변경할 수 있다는 장점이 있다.

#include <iostream>
using namespace std;

int main()
{
    int arr[] = {0, 1, 2, 3, 4, 5};
    for (int &i : arr)
    {
        i += 1;
        cout << i << ' '; // 출력값 1 2 3 4 5 6
    }
    cout << arr[0]; // 출력값 1
}

 

아까의 예시와는 다르게 for문이 끝나도 arr [0]의 값이 1로 유지된다.

const 키워드 또한 사용 가능하며 reference와 함께 사용 가능 하다.

#include <iostream>
using namespace std;

int main()
{
    int arr[] = {0, 1, 2, 3, 4, 5};
    for (const int &i : arr)
    {
        i += 1; //expression must be modifiable lvalue
        cout << i << ' '; 
    }
    cout << arr[0]; 
}

 

위의 코드에서는 상수 값인 i의 값을 변경하려 했기에 컴파일 에러가 뜬다.


Auto

auto 키워드는 변수를 선언할 때 자료형 대신 사용한다. auto 키워드로 선언한 변수의 초깃값의 형식에 맞춰 인스턴스의 형식을 자동으로 결정한다.

auto d = 5.0;
auto i = 1 + 2;

 

함수 매개 변수와 함께 사용할 수 없다. 아래의 코드는 작동하지 않는다.

void add(auto x, auto y){
  std::cout << x + y;
}

iterator로 작동할 수 있고 const, &, * 키워드와 함께 사용할 수 있다. 이 때문에 range based for에서 많이 사용한다.

for(auto it = v.begin(); it != v.end(); ++it)
  *it *= 2;