구문
for (for-range-declaration : 식)
statement
설명
기존의 for문과 달리, 시작과 끝점을 알려주지 않아도 알아서 처음부터 끝까지 순회하는 반복문
- index 정보 존재하지 않음
- 기존의 for문에서는 index를 나타내는 로컬 변수가 존재하는데, 범위기반 for문에는 존재하지 않음
- 오직 elem이라는 값만 존재
- 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;
}
'Old > 복습' 카테고리의 다른 글
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 |