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 |