Metaverse/복습

C++ - 범위 기반 for문

onenewkong 2024. 1. 3. 00:08

구문

for (for-range-declaration : 식)
	statement

 

설명

기존의 for문과 달리, 시작과 끝점을 알려주지 않아도 알아서 처음부터 끝까지 순회하는 반복문

  1. index 정보 존재하지 않음
    • 기존의 for문에서는 index를 나타내는 로컬 변수가 존재하는데, 범위기반 for문에는 존재하지 않음
    • 오직 elem이라는 값만 존재
  2. array의 요소를 변경할 수 없음

매 반복문을 돌 때마다 int elem : arr을 통해 하는 일은 다음과 같음

elem = arr[0];

elem = arr[1];

  • 이런식으로 array의 요소들이 elem이라는 변수에 복사됨
  • 배열의 요소를 내부에서 바꾸려고 해도 복사된 값이므로 요소 값이 바뀌지 않음

 

reference, const reference

위에서 말한대로, 반복문이 돌 때마다 복사가 됨

  • 배열의 원래 값을 변경하지 못함
  • 복사 비용이 발생함

이러한 단점을 보완하기 위해 C++의 참조자를 사용

또한, 반복문 내부에서 변경이 일어나지 않아야 하는 경우에는 const를 사용

 

auto 키워드

: 컴파일러가 선언된 변수 또는 람다식 매개변수의 초기화식을 사용해 해당 형식을 추론하도록 함

범위 기반 for문에서 자주 사용되는 이유

  • 자료형 추론: 컴파일러가 반복되는 컨테이너의 원소의 자료형을 추론하여 코드를 간결하게 함
// 예전의 방식
std::vector<int> vec = {1, 2, 3, 4, 5};
for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    // ...
}

// 범위기반 for문과 auto 사용
std::vector<int> vec = {1, 2, 3, 4, 5};
for(auto it = vec.begin(); it != vec.end(); ++it) {
    // ...
}
  • 가독성 향상: 1번과 같은 맥락, 반복문에서 컨테이너의 원소를 직접 다룰 때 코드의 의도를 명확하게 전달할 수 있음
std::vector<int> vec = {1, 2, 3, 4, 5};

// 예전의 방식
for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << std::endl;
}

// 범위기반 for문과 auto 사용
for(auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << std::endl;
}
  • 유연성 증가: 컨테이너의 원소의 자료형이 변경되어도 코드 수정이 필요하지 않음
std::vector<int> vec = {1, 2, 3, 4, 5};

// 자료형 변경에 덜 민감한 코드
for(auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << std::endl;
}

std::vector<double> doubleVec = {1.1, 2.2, 3.3, 4.4, 5.5};

// 동일한 코드를 그대로 사용 가능
for(auto it = doubleVec.begin(); it != doubleVec.end(); ++it) {
    std::cout << *it << std::endl;
}

'Metaverse > 복습' 카테고리의 다른 글

STL - max_element와 min_element  (0) 2024.01.18
C++ - 복사 생성자  (1) 2024.01.03
C++ - 생성자와 소멸자  (0) 2023.12.27
운영체제 - Call Stack  (0) 2023.12.27
운영체제 - Thread  (0) 2023.12.27