SKYLIGHT STUDIO

[C++ 리바이브] 범위 기반 for 루프 본문

Computer Programming/Coding Test(C++)

[C++ 리바이브] 범위 기반 for 루프

SKY_L 2024. 11. 2. 07:00

전쟁에서 불가피한 것처럼 보이는 증오를 극복할 날이 올 것입니다. 유럽인이 살 수 있는 유럽은 언젠가 반드시 실현될 것입니다. - 빌리 브란트

 

C++ 11부터 새롭게 도입된 루프. 기존의 for문보다 강화된 형태다.

 

기본 문법은 다음과 같다.

for (element_declaration : container) {
    // 반복할 코드
}

 

element_declaration은 컨테이너에서 꺼낸 각 요소를 받는 변수 선언,

container은 배열이나 vector이나 map 등의 자료구조,

다음은 본격적인 예제이다.

 

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main() {
    map<string, int> score = {{"Alice", 90}, {"Bob", 85}, {"Charlie", 95}};
    
    for(const auto& pair : score) {
    	cout << pair.first << ": " << pair.second << endl;
        }
        
        return 0;
}

 

앞서 말한대로 const auto*로 변수 선언, score은 map 자료구조.

여기서 first는 key이고 second는 value이다. 오해하지 말자.

 

const auto&에 대해서는 아래에서 더 추가적으로 설명한다.

 


 

for (const auto& pair : score)

 

1) const
반복문 안에서 요소를 수정할 수 없도록 만든다.

 

예를 들어 상기 코드 내에서 pair.first와 pair.second(각각 keyvalue)가 수정할 수 없게 된다. 이 경우에는 안정성을 높이고 최적화하는 용도이다.

 

2) auto&

C++ 11에서 추가된 타입 추론 기능.

 

컴파일러가 반복문을 순회화며 각 요소의 타입을 자동으로 추론까지 하는 것.
map<string int>의 각 요소는 결국 pair<const string, int>인데, 이걸 명시적으로 적을 필요 없이 auto로 간단하게 처리하는 것이다.

&(참조자)로 요소를 받아야 불필요한 복사를 방지할 수 있다.

만약 참조(&) 없이 auto pair**로 사용하면, 매번 새로운 복사본이 만들어져 퍼포먼스에 악영향을 줄 수 있다. 특히 큰 객체가 저장된 컨테이너에서는 복사가 대단히 비율적이기 때문.

간단하게 얕은 복사를 하도록 구현한 것.

 

 

'Computer Programming > Coding Test(C++)' 카테고리의 다른 글

[C++ 리바이브] Map  (2) 2024.10.30
[C++][1773] 폭죽쇼  (1) 2024.10.08
[C++/1076] 저항  (0) 2024.10.08
[C++][2547] 사탕 선생 고창영  (1) 2024.10.02
[C++ 리바이브] C++ 동적 배열  (0) 2024.10.02