가장 간단한 루프는 range-for 명령문이다. 단순히 범위의 각 요소에 대한 프로그래머 액세스 권한을 제공한다.
int sum(vector<int>& v)
{
int s = 0;
for (int x : v)
s+=x;
return s;
}
for(int x : v)는 "범위 v의 각 요소 x에 대해" 또는 "v에 있는 각 x에 대해"로 읽을 수 있다. v의 요소는 처음부터 마지막까지 순서대로 동작된다. 요소(여기서는 x)를 명명하는 변수의 범위는 for문이다. 콜론 뒤의 표현식은 시퀀스(범위)를 나타내야 한다. 즉, 반복자를 얻기 위해 v.begin() 및 v.end() 또는 begin(v) 및 end(v)를 호출할 수 있는 값을 생성해야 한다.
- 컴파일러는 먼저 begin 및 end 멤버를 찾고 이를 사용하려고 시도한다. 범위로 사용할 수 없는 시작 또는 끝이 발견되면 (예: begin 멤버가 함수가 아니라 변수이기 때문에) range-for 문은 에러다.
- 그렇지 않으면 컴파일러는 범위 내에서 begin/end 쌍을 찾는다. 만약 아무것도 발견되지 않거나 발견된 것을 사용할 수 없는 경우 (예: 시작이 시퀀스 유형의 인수를 취하지 않았기 때문에) range-for 문은 에러다.
컴파일러는 buit-in 배열 T v[N]에 대해 v 및 v+N을 begin(v) 및 end(v)로 사용한다. <iterator> 헤드는 built-in 배열과 모든 표준 라이브러리 컨테이너에 대해 begin(c) 및 end(c)를 제공한다. 자체 설계 시퀀스의 경우 표준 라이브러리 컨테이너에 대해 수행하는 것과 동일한 방식으로 begin() 및 end()를 정의할 수 있다.
예제에서 현재 요소를 참조하는 제어 변수 x는 동등한 for문을 사용할 때 *p와 같다.
int sum2(vector<int>& v)
{
int s = 0;
for (auto p = begin(v); p!=end(v); ++p)
s+=∗p;
return s;
}
range-for 루프에서 요소를 수정해야 하는 경우 요소 변수는 참조여야 한다. 예를 들어 다음과 같이 벡터의 각 요소를 증가시킬 수 있다.
void incr(vector<int>& v)
{
for (int& x : v)
++x;
}
참조는 클 수 있는 요소에도 적합하므로 요소 값에 복사하는데 비용이 많이 들 수 있다.
template<class T> T accum(vector<T>& v)
{
T sum = 0;
for (const T& x : v)
sum += x;
return sum;
}
range-for 문은 간단한 구성이다. 예를 들어, 그것을 사용하면 동시에 두 개의 요소를 작업할 수 없고 두 개의 범위를 건너 뛸 수 없다. 이를 위해서는 일반적인 for문이 필요하다.
'Program Language > C & C++' 카테고리의 다른 글
[C++] 계산기 만들기 (2) input (0) | 2022.01.06 |
---|---|
[C++] 계산기 만들기 (1) parser (4) | 2022.01.05 |
[C++] 선언 명령문 (0) | 2022.01.05 |
[C++] Enumerations (0) | 2022.01.04 |
[C++] Unions (0) | 2022.01.04 |