개발자 면접 공부/C-C++

C++ 11 범위기반 for문 (for each)

chogyujin 2024. 6. 16. 17:26
728x90

1. 개요

오늘은 for each에 대해 알아보겠습니다.


2. for each?

기존 for문은 조건을 입력을 하여 돌리는 형식입니다.

vector<int> arr = {1,2,3,4,5,6};
for(int i=0;i<arr.size();i++)
{
	cout<<arr[i]<<' ';
}

하지만 for each문을 사용하면 쉽게 조건문을 안넣고 사용이 가능합니다.

vector<int> arr = {1,2,3,4,5,6};
for(int i : arr)
{
	cout<<i<<' ';
}

여기서 int i 는 arr에 인덱스 별로 값을 복사받아 출력을 하는 문장입니다.
하지만 이것을 참조변수로도 가능합니다.

vector<int> arr = {1,2,3,4,5,6};
for(int& i : arr)
{
	i = 60;
	cout<<i<<' ';
}

이러면 arr에 있는 내용 전부가 60으로 변경이 될겁니다.

또한 auto문을 사용하여 for each를 사용할수 있습니다. 물론 참조도 가능합니다.

vector<int> arr = {1,2,3,4,5,6};
for(auto i : arr)
{
	cout<<i<<' ';
}
for(auto& i : arr)
{
	cout<<i<<' ';
}

for each문은 가시적으로도 보기 좋습니다.
하지만 이런 경우에는 어떻게될가요?


3. 객체를 for each 해보자

#include<iostream>
#include<vector>

using namespace std;
class A
{
public:
	A() { cout << "생성자" << '\n'; }
	A(const A& a) { cout << "복사 생성자" << '\n'; }
	A(A&& a) { cout << "이동 생성자" << '\n'; }
	~A() { cout << "소멸자" << '\n'; }
};
int main()
{
	vector<A> arr;
	arr.emplace_back(A{});
	arr.emplace_back(A{});
	arr.emplace_back(A{});
	arr.emplace_back(A{});
	for (A i : arr)
	{
		
	}
	return 0;
}

위에 emplace_back 같은경우는 어차피 vector에서 resizing이 일어나기 때문에 이동생성자 복사생성자 사용되는건 빼고
for each만 봤을때는 복사 생성자가 호출되고 소멸자가 호출이 됩니다.
이걸 해결하기위해 &참조를 붙이면 됩니다.

#include<iostream>
#include<vector>

using namespace std;
class A
{
public:
	A() { cout << "생성자" << '\n'; }
	A(const A& a) { cout << "복사 생성자" << '\n'; }
	A(A&& a) { cout << "이동 생성자" << '\n'; }
	~A() { cout << "소멸자" << '\n'; }
};
int main()
{
	vector<A> arr;
	arr.emplace_back(A{});
	arr.emplace_back(A{});
	arr.emplace_back(A{});
	arr.emplace_back(A{});
	for (A& i : arr)
	{
		
	}
	return 0;
}

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

정적 링킹 vs 동적 링킹  (0) 2024.07.04
템플릿(Template)  (1) 2024.07.01
extern 쓰는법  (0) 2024.06.11
Volatile  (0) 2024.04.29
네임 맹글링  (0) 2024.04.14