SW/C++

C++ : 범위 기반 for 반복문 : 장점, 개념, 예제, 구현

얇은생각 2020. 5. 2. 07:30
반응형

C++ : 범위 기반 for 반복문 : 장점, 개념, 예제, 구현

 

범위 기반 for 반복문

int scores[3] = { 10, 20, 30};

for ( int score : scores)
{
  std::cout << scores << " " << std::endl;
}

 

for 반복문을 더 간단하게 쓸 수 있습니다. 이전의 for 반복보다 가독성이 더 높습니다. STL 컨테이너와 C 스타일 배열 모두에서 작동합니다. auto 키워드를 범위 기반 for 반복에 쓸 수 있습니다. 컨테이너/배열을 역순회할 수 없습니다. 

 

 

 

for_each() ??

#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>

int main()
{
  std::unordered_map<std::string, int> scores;
  
  scores["lulu"] = 70;
  scores["chris"] = 50;
  scores["monica"] = 100;
  
  auto printElement = [](std::unodered_map<std::string, int>::value_type& item)
  {
    std::cout << item.first << " : " << item.second << std::endl;
  };
  
  for_each(scores.begin(), scores.end(), printElement);
  
  return 0;
}

 

C++03 컨테이너의 각 요소마다 함수를 실행하는 알고리듬입니다. 범위 기반 for 만큼 가독성이 높지 않습니다. 이러한 방식으로 활용하기 보다는 범위기반 for가 훨씬 좋은 것 같습니다.

 

 

 

값, 참조, const

std::map<std::string int> scoreMap;

for(auto score : scoreMap)
{
  score.second -= 10;
  std::cout << score.first << " : " << score.second << std::endl;
}

for(auto& score : scoreMap)
{
  score.second -= 10;
  std::cout << score.first << " : " << score.second << std::endl;
}

for(const auto& score : scoreMap)
{
  score.second -= 10;
  std::cout << score.first << " : " << score.second << std::endl;
}

 

범위 기반 반복문을 사용할 때, 실제 변수 값을 변경하기 위해서는 참조를 넣어주어야 합니다. 그렇지 않은 경우에는 const를 넣어주거나 값만 넣어주어도 무방합니다.

 

 

 

예제

#include <vector>
#include <iostream>
#include "RangeBasedForLoopExample.h"

using namespace std;

namespace samples
{
	void RangeBasedForLoopExample()
	{
		vector<int> nums;
		nums.reserve(5);

		nums.push_back(1);
		nums.push_back(2);
		nums.push_back(3);
		nums.push_back(4);
		nums.push_back(5);

		for (int n : nums)
		{
			n++;
		}

		cout << "Print nums:" << endl;

		for (auto it = nums.begin(); it != nums.end(); ++it)
		{
			cout << *it << endl;
		}

		for (int& n : nums)
		{
			n--;
		}

		cout << "Print nums again:" << endl;

		for (auto it = nums.begin(); it != nums.end(); ++it)
		{
			cout << *it << endl;
		}
	}
}

 

range based for문과 일반적인 반복자를 활용한 for문에 대한 예제입니다. 범위 기반 for문을 쓸 수 있는 경우에는 이러한 for문을 활용하면 가독성도 높이고 깔끔하게 구현이 가능합니다. 해당 원본 코드는 아래 경로에서 확인할 수 있습니다.

 

https://github.com/POCU/COMP3200CodeSamples/blob/master/11/RangeBasedForLoopExample.cpp

 

POCU/COMP3200CodeSamples

Code samples for COMP3200. Contribute to POCU/COMP3200CodeSamples development by creating an account on GitHub.

github.com

반응형