2 분 소요

범위 기반 for()

기존의 for()컨테이너와 함께 사용할때 다음과 같이 이터레이터를 이용하여 컨테이너 요소를 탐색해야 했는데요(제어문이터레이터를 이용한 요소 접근 참고),

1
2
3
4
5
6
7
8
9
10
11
std::vector<int> v_11{1, 2, 3};

int sum{0};

// 컨테이너 요소를 탐색 합니다.
std::vector<int>::iterator itr{v_11.begin()};
std::vector<int>::iterator endItr{v_11.end()};
for (;itr != endItr; ++itr) {
    sum += *itr;
}
EXPECT_TRUE(sum == 1 + 2 + 3);

C++11 부터는 범위 기반 for()를 이용하여 좀더 간단하게 구현할 수 있습니다.

1
2
3
4
5
6
7
8
9
std::vector<int> v_11{1, 2, 3};

int sum{0};

for (int val : v_11) { // 혹은 for (auto val : v_11)
    sum += val;
}

EXPECT_TRUE(sum == 1 + 2 + 3);

또한 참조자 타입을 이용하면 컨테이너 요소의 값을 쉽게 변경할 수 있습니다.

1
2
3
4
5
6
7
std::vector<int> v_11{1, 2, 3};

for (int& val : v_11) { // 혹은 for (auto& val : v_11)
    ++val; // 벡터의 요소가 수정됩니다.
}

EXPECT_TRUE(v_11[0] == 2 && v_11[1] == 3 && v_11[2] == 4);

(C++20~) 범위 기반 for()에서 초기식이 추가되었습니다.

(C++17~) 초기식을 포함하는 if(), switch()

기존의 if()switch() 는 조건식 만을 평가했습니다. 따라서, 특정 함수의 리턴값을 확인하는 경우에는 다음과 같이 표현했는데요,

1
2
3
4
int* result{Func()}; // 결과값을 구한 후
if (result != nullptr) { // 조건 평가
    // Todo
}

리턴값이 만약 스마트 포인터(shared_ptr)라면 유효 범위를 짧게하기 위해 다음과 같이 중괄호를 이용했었습니다.

1
2
3
4
5
6
7
{ // 유효 범위를 짧게 하기 위해 중괄호를 사용했습니다. 
    // result는 중괄호가 끝나면 소멸됩니다.
    std::shared_ptr<int> result{Func()};
    if (result != nullptr) {
        // Todo
    }
} // 여기서 result가 소멸됩니다.

C++17 부터는 if()switch()에서 초기식을 실행후 조건식을 평가할 수 있어, 다음처럼 코드를 간결하게 작성할 수 있습니다. 초기식에 작성된 변수의 유효 범위if()switch()의 끝입니다.

1
2
3
4
// result_17은 if 문이 끝나면 소멸됩니다.
if (std::shared_ptr<int> result_17{Func()}; result_17 != nullptr) {
    // Todo
}

(C++20~) 범위 기반 for()에서 초기식

기존의 범위 기반 for()에서는 초기식을 제공하지 않았는데요(범위 기반 for() 참고),

C++20 부터는 범위 기반 for()에서 초기식을 사용할 수 있습니다.

1
2
3
4
5
6
7
8
int sum{0};

// 초기식을 이용하여 v_20 값을 초기화 합니다.
for (std::vector<int> v_20{1, 2, 3}; int val : v_20) { 
    sum += val;
}

EXPECT_TRUE(sum == 1 + 2 + 3);

태그:

카테고리:

업데이트:

댓글남기기