우선 범위지정 for 문은 이런걸 말한다.

1
2
3
4
5
6
int arr[] = {1,2,3,4,5};
 
for(int a : arr)
{
    cout << a << endl;
}
cs


c++ 11부터 추가되었고 배열이나 stl 의 요소들을 돌아볼때(?) 쓴다.

(참고로 동적할당된 배열은 끝을 알 수 없기 때문에 그냥 돌릴 수 없음)


https://msdn.microsoft.com/ko-kr/library/jj203382.aspx?f=255&MSPPError=-2147217396



내가 만든 클래스(혹은 구조체든 뭐든)이 범위기반 for문을 쓰려면 어떻게 해야할까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Test
{
public:
    int arr[10];
...
}
 
 
void main()
{
    Test test;
    for(int a : test.arr)
    {
        cout << a << endl;
    }
}

cs


이런 식으로 쓰면 되겠지만


배열이름까지 쓰는게 번거롭다면?

만약 내가 만든 클래스안에 있는 배열이 private라면?


배열이 동적할당된 배열이라면

내가 만든 클래스안에 있는 배열의 목적은 처음부터 끝까지 도는게 아니라면?



 msdn은 답을 알고 있다.

범위 기반 for 에 대한 이러한 사실을 명심하십시오:

  • 배열을 자동으로 인식 합니다.

  • .begin() 및 .end() 을 가진 컨테이너를 인식하십시오.

  • 기타 항목을 위해 begin() 및 end() 인수 종속성 조회 사용하기.


예제가 안나와서 조금 헤매기는 했지만


간단히 예제를 만들어 보면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Test
{
    int arr[10= { 1,2,3,4,5,6,7,8,9,0 };
    int min = 3;
    int max = 7;
public:
    int* begin() { return &arr[min]; }
    int* end() { return &arr[max]; }
};
 
void main()
{
    Test test;
    for (int a : test)
    {
        cout << a << endl;
    }
}
cs

이런식으로 처음과 끝 주소값을 반환하는 begin 과 end 함수를 만들어 주면 된다.


블로그 이미지

stuban

ㅇ.ㅇ

,