수색…


컨테이너를 통해 루핑하기

C ++에서, 일련의 용기를 통해 루프 c 는 다음과 같이 인덱스를 사용하여 수행 할 수있다 :

for(size_t i = 0; i < c.size(); ++i) c[i] = 0;

간단하지만, 그러한 저작은 잘못된 비교 연산자 또는 잘못된 색인 변수와 같은 일반적인 의미 론적 오류가있을 수 있습니다.

for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
                     ^~~~~~~~~~~~~~^

반복기를 사용하여 모든 컨테이너에 대해 루프를 수행 할 수 있으며 비슷한 단점이 있습니다.

for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;

C ++ 11에서는 범위 기반 루프 및 auto 키워드를 도입하여 코드가 다음과 같이 될 수 있도록했습니다.

for(auto& x : c) x = 0;

여기서 유일한 매개 변수는 컨테이너 c 와 현재 값을 보유하는 변수 x 입니다. 이렇게하면 앞에서 지적한 의미 오류를 방지 할 수 있습니다.

C ++ 11 표준에 따르면 기본 구현은 다음과 같습니다.

for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
    // ...
}

이러한 구현에서는 auto begin = c.begin(), end = c.end(); beginend 은 동일한 유형이어야하며 end 은 결코 증가하지 않고 참조 해제되지 않습니다. 따라서 범위 기반 for 루프는 쌍 반복자 / 반복자로 정의 된 컨테이너에서만 작동합니다. C ++ 17 표준은 구현을 다음과 같이 변경하여이 제약을 완화합니다.

auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
    // ...
}

여기서 beginend 은 불평등을 비교할 수있는 한 다른 유형이 될 수 있습니다. 이렇게하면 더 많은 컨테이너, 예를 들어 쌍 반복자 / 센티널에 의해 정의 된 컨테이너를 반복 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow