본문 바로가기

Language/C++ 그때그때 끄적끄적

[C++] range based for(범위 기반 for문)

반복문을 작성할때는 습관처럼 for(int i = 0; i <range; i++) 이런식의 코드를 작성하곤했습니다 그런데 어느순간부터

for(n : range) 이러한 처음보는 방식의 코드들이 눈에 들어오기 시작해 어떤한 코드인지 알아보고 싶어졌습니다

 

  1. 범위 기반 for문이란
  2. 범위 기반 for문 사용법
  3. 범위 기반 for문 reference, const reference

 

 

1. 범위 기반 for문이란

C#의 foreach와 같은 방식으로 기존의 for 문의 초기화, 조건,증감 등의 시작과 끝에 해당하는 조건이 없더라도 특정 범위가있는 배열을 처음부터 끝까지 알아서 순회해주는 반복문 이며

C++11부터 사용이 가능하다고 합니다 

 

2. 범위 기반 for문 사용법

#include"iostream"
#include<vector>
using namespace std;

int main()
{ 
	int arr[5] = { 1,4,2,5,6 };


	for (int n : arr)
	{
		cout << n << ' ';
	}

	for (int n : arr)
	{
		cout << n << ' ';
	}
}

사용방법은 위의 코드처럼 간단합니다

for( 데이터 타입 elem : 데이터 리스트 )

{

      cout << elem<< endl;

}

데이터 타입은 데이터 리스트에서 받아올 데이터의 타입을의미합니다

elem 복사한 데이터의 변수 이름입니다

데이터 리스트에서 데이터를 받아올 데이터 타입을 의미합니다

데이터 리스트는 배열이나 벡터와같은 순회가 가능한 데이터 타입일 경우 가능합니다 또한 앞에 는 필수적으로 붙여줘야합니다

 

하지만 위와같은 범위기반 for문은 기존의 for문을 완전히 대체할 수 는 없습니다

그 이유는 크게 2가지로

1. index 정보가 없다

2. 배열의 요소를 변경할 수 없다

이는 범위 기반 for 문이 i 를통한 인덱스로의 직접적인 배열접근이 아닌  elem에 데이터 리스트의 정보를 복사하는 구조기 때문에 발생하는 문제입니다

 

 

3. 범위기반 for문 reference, const reference

 

범위 기반 for문은 데이터 리스트의 인자를 복사해서 elem에 넣어주는 주고입니다 복사를 하기때문에 발생하는 단점이 있습니다

  1. 배열의 원래 값들을 변경하지 못합니다
  2. 복사비용이 발생합니다

위와같은 단점을 보완하고자 우리는 C++의 &(참조자, reference)를 이용해야합니다

사용방법은 간단합니다

for(int& elem : arr)

{

elem += 100;    //arr[ ] 값도 변경됨.

cout << elem << endl;

}

#include"iostream"
#include<vector>
using namespace std;

int main()
{ 
	int arr[5] = { 1,4,2,5,6 };

	for (int &elem : arr)
	{
		elem += 100;
		cout << elem << ' ';
	}
}
// 출력 101 104 102 105 106

기본의 형태에 elem 앞에 &(참조자, reference)를 붙여주면 끝 참조자를 붙여줌으로써 값을 복사가 아닌 참조의 형태로 변수를 가져오기때문에 배열의 원래 원소들을 변경 할 수 있습니다

만일 복사 비용이 안드는것만 해결하고 내부에서 값을 변경이 이루어지지 않아야 하는 경우는 const와 & (참조자,reference)를 같이 사용하는 방법을 취하면됩니다

 

for(const int& elem : arr)

{

elem += 100;    // 불가능.

cout << elem << endl;

}

#include"iostream"
#include<vector>
using namespace std;

int main()
{ 
	int arr[5] = { 1,4,2,5,6 };

	for (const int& elem : arr)
	{
		elem += 100;			// 안됨
		cout << elem << ' ';
	}
}

const를 데이터 타입 앞에 붙임으로써 값을 변경이 불가능해지면서 복사 비용이 들어가지않기때문에

기본적인 범위기반for문보다는 const &를 사용하는게 좋아보입니다

상황에 따라서 &나 const &를 사용하면 좋을거 같습니다

 

'Language > C++ 그때그때 끄적끄적' 카테고리의 다른 글

[C++]map 사용법  (0) 2024.11.10
[C++]Constexpr  (0) 2024.02.19
[C++] 문자열 나누기 spring split  (0) 2023.05.15
[C++] Iterator 반복자  (0) 2023.05.10
[C++]람다식이란  (0) 2022.05.11