티스토리 뷰

반응형

필자는 코딩을 Python 3 로 시작하였고, 따라서 아직 C++ 문법보다 Python 3 의 문법에 조금 더 익숙하다.

 

따라서, C++ 11부터 지원되는 range-based for문을 자주 사용한다.

 

Python을 다루어보지 않은 C++ 사용자들도 알아두면 좋은 문법이니 소개하도록 한다.

 

또한, 매번 배열의 길이를 넣어주느라 피곤한 프로그래머들은 다른 형태의 for문을 알아두는 것이 좋다고 생각한다.


1. range-based for loop

Range-based for loop문은 다음과 같은 꼴을 가진다.

 

1
2
3
4
vector<int> V = {1234};
for(int x : V) {
    // do something
}
cs

 

Python을 다루었던 기억이 있는 프로그래머들은 위와 같은 코드가 익숙하지만, 다루지 않았던 프로그래머들은 위와 같은 코드가 조금 어색할 수 있다.

 

C++ 사용자들에게 조금 더 와닿는 표현을 하자면 for문을 돌 container에서 iterator가 하나씩 자료를 가리키며 x에다 담아준다고 생각하면 된다. (사실 Python의 for문도 비슷하지만 조금 다른 방법으로 구현되어 있다.)

 

구체적으로 설명하면, for loop가 돌아가며 x에 차례로 1, 2, 3, 4가 담긴다고 생각하면 된다.

 

따라서, iteration이 가능한 container이라면 어떤 형태든 ranged-based for loop이 가능하다는 이야기이다.

 

예를 들자면 std::vector, std::list, std::set, std::map, std::deque 등등 다양하게 사용이 가능하다는 이야기이다.


2. range-based for loop의 활용

 

C++에서 사용되는 reference 연산자 &를 사용하면 원래 container의 값을 수정할 수도 있다.

 

1
2
3
4
vector<int> V = {1234};
for(int &x : V) {
    x = 0// V 안의 값을 0으로 수정
}
cs

 

이러한 점을 응용하면, PS에서 자주 사용되는 다음과 같이 input에도 활용할 수 있다.

 

만약, int형 10개를 받고 싶으면 다음과 같이 코드를 작성할 수 있다.

 

1
2
3
4
vector<int> V(10);
for(int &x : V) {
    cin >> x; // input을 x에 
}
cs

ranged-based for문에서 자료를 하나씩 들고올 때 어떤 자료형을 들고올 지 모르는 경우가 발생할 수 있으므로, 만약 컴파일러가 알아서 자료형을 지정하도록 하고 싶으면 auto형 을 사용하면 된다.

 

1
2
3
4
vector<int> V(10= {1234567890};
for(auto &x : V) { // 어떤 것이 들어올 지 모르니 auto형 사용
    cout << x; // 자동으로 int형으로 추론된 x 
}
cs

 

다만, 컴파일러가 자료형의 크기를 알 수 없거나, 동적 배열과 같이 컴파일 이후 배열의 크기가 결정될 경우 range-based for문을 사용할 수 없다. 구체적으로는 배열에 사용하지 못한다는 의미이다.

 

지금까지의 내용을 3줄로 요약하면 다음과 같다.


3. 3줄 요약

1. range-based for문은 python의 for문과 비슷하게 하나씩 데이터를 들고온다.

2. 다만, 동적 배열이나 배열에는 사용할 수 없다.

3. 코드의 가독성이 높아지니 많이많이 사랑해주자.


reference 연산자와 같이 다른 문법과 range-based for문을 잘 활용하면, 코드의 길이를 확연히 줄이고 가독성을 높일 수 있으니 잘 활용하여보자! (필자는 특히 그래프 탐색에서 자주 사용한다.)

 

도움이 되었다면 지나가는 길에 하트 하나 눌러주세요, 양질의 글을 쓰는데 하나의 동기부여가 됩니다😍

지적이나 오타 수정 댓글 환영합니다!!

 

PS. 이거 사용하면 매번 for문에 size 안넣어주어도 된다.

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함