Intro
이번에 포스팅에서는 auto와 더불어 유용하고, 사용하기 쉬운 기능 중 하나인 range based for에 대해 포스팅을 시작하겠습니다.
range based for
range based for를 사용하면 반복만을 아주 쉽고 안전하게 사용이 가능합니다. 이 기능은 기존의 visual C++의 특화 기능인 for each문과 비슷합니다. 때문에 기존의 for each를 사용하고 있는 개발자라면 for each를 range based for 문으로 바꾸어 사용하면 됩니다.
간단한 예시코드를 통해 일단 for문과 range based for문의 차이를 알아보겠습니다.
#include <iostream>
using namespace std;
int main(void)
{
int nNumList[5] = { 5,6,7,8,9 };
cout << "for문" << endl;
for (int i = 0; i < 5; i++)
cout << nNumList[i] << endl;
cout << "ranged based for문" << endl;
for(auto i : nNumList)
cout << i << endl;
}
결과
코드로 보면 별차이 없어 보입니다. 하지만 가장 큰 차이는 for문은 for(int i = 0;i<5;i++) i = 0, i = 5까지 직접 넣어주었고 ranged based for문은 for(auto i : nNumList) nNumList의 처음부터 끝까지 자동으로 범위를 지정해주었습니다. 자동으로 for문의 범위를 지정해준다는 의미는 생각보다 큽니다. 보통 for문을 이용해 배열의 끝까지 자동으로 데이터 값을 얻기 위해서는 개발자가 직접 for문의 범위를 지정해주거나 sizeof를 사용하여 배열의 크기를 얻는 방법이 있는데 range based for문을 사용함으로 반복문의 사용이 편리해졌을 뿐만 아니라 for문을 사용할 때 종료 조건이 잘못되어 메모리를 침범하게 되는 위험도 피할 수 있습니다.
range based for문을 STL 컨테이너도 사용이 가능합니다. 간단한 예시 코드로 알아보겠습니다.
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int main(void)
{
cout << "range based for - vector" << endl;
vector<int>NumList;
NumList.push_back(5);
NumList.push_back(6);
NumList.push_back(7);
NumList.push_back(8);
NumList.push_back(9);
for (auto i : NumList)
cout << i << endl;
cout << endl;
cout << "range based for - unoedered_map" << endl;
unordered_map<int, string> NumString;
NumString.insert(make_pair<int, string>(1, "abc"));
NumString.insert(make_pair<int, string>(2, "def"));
NumString.insert(make_pair<int, string>(3, "ghi"));
for (auto i : NumString)
cout << "Num : " << i.first << ", string : " << i.second << endl;
}
결과
기본적으로 STL의 iterator를 지원하는 컨테이너라면 range based for문을 문제없이 사용할 수 있습니다. 그러므로 프로그래머가 자신만의 컨테이너를 만들 때 STL에서 정의한 iterator의 기능을 구현하면 range based for문을 사용할 수 있습니다.
코드를 구현하다보면 for문을 이용해 데이터 요소 값을 바꾸고 싶을 때가 있습니다. 그럴 때는 참조를 사용하면 됩니다.
for (auto& i : nNumList)
예시코드
#include <iostream>
using namespace std;
int main(void)
{
int nNumList[5] = { 5,6,7,8,9 };
cout << "for문" << endl;
for (int i = 0; i < 5; i++)
cout << nNumList[i] << endl;
cout << "ranged based for문" << endl;
for (auto& i : nNumList)
i = 10;
for (int i = 0; i < 5; i++)
cout << nNumList[i] << endl;
}
결과
for문에서 요소 값을 변경하지 못하도록 하려면 const를 사용하면 됩니다.
for(auto const i : nNumList)
마무리
저 같은 경우 영상처리 알고리즘을 돌릴 때 보통 for문의 범위를 수동으로 지정하거나 자료형의 sizeof를 통해 크기를 얻어 범위를 지정해서 돌리기 때문에 가끔 메모리 침범해서 벅나는 경우가 많았습니다. 하지만 range based for을 사용하면 개발자의 실수에 의한 메모리 침범을 피할 수 있는 게 가장 큰 장점인 것 같습니다.
그럼 이상으로 포스팅을 마치겠습니다. 감사합니다.
'[C++ STL]' 카테고리의 다른 글
[C++ STL - forward_list] (0) | 2021.06.24 |
---|---|
[STL - 메모리 관리(스마트 포인터 shared_ptr, unique_ptr] (0) | 2021.06.08 |
[C++ STL - tuple] (0) | 2021.05.21 |
[C++ STL - 람다(lambda)] (0) | 2021.05.04 |
[C++ STL - auto] (0) | 2021.04.28 |