for loop에서 const &auto의 사용
for문을 사용하다보면 for(int i : res) 와 같은 문법을 사용할 때가 있다. 그런데 for(const auto& i : res) 문법도 있다. 둘의 차이는 값을 복사해서 넣는지, 참조만 하는지의 차이이다. 이 특성으로 인해 PS에서 시간초과가 날 수도 있다.
ranged loop
for(int i : res) cout << i << '\n';
위 for loop의 경우에는 res에서 i를 새로 만들어 값을 복사해서 넣는다. 그래서 i = 0과 같은 코드를 시행해도 원본은 바뀌지 않는다. 하지만 값을 복사하기 때문에 그 비용이 든다.
for(auto& i : res) cout << i << '\n';
위 for loop의 경우는 res의 값을 그대로 참조한다. 그래서 i = 0 명령을 내리면 값이 변경된다. 원본 배열이 변경될 수 있기 때문에 주의가 필요하다.
for(const auto& i : res) cout << i << '\n';
const를 넣으면 read only로 인식하기 때문에 값을 바꾸려고 하면 오류가 발생한다. 값이 변경되는 위험이 사라져 위 코드보다 안정적이다.
정리
&를 붙이지 않고 단순히 auto나 명시적 타입 표기를 하면 값을 복사하면서 새 변수를 생성하는 것과 같다. 단순히 읽기만 하는데 값을 복사할 필요는 없으므로 auto&를 사용하는 것이 성능상 낫다. 다만 auto&를 사용하면 원본 값이 바뀔 수 있기 때문에 const를 붙여서 const auto&를 사용하는 것이 좋다고 한다.
'C++' 카테고리의 다른 글
[C++] CPP에서 변수 이름 y1을 사용하지 못하는 건에 대하여 (7) | 2024.12.10 |
---|---|
[C++] assign과 resize의 차이 (1) | 2024.11.10 |
[C++] 소수점 고정 시 반올림 오류와 부동 소수점 오차 (0) | 2024.08.13 |
[C++] 소수점 고정 출력과 cout << fixed, cout << setprecision(), cout.precision() (0) | 2024.08.13 |
[C++] cin과 getline(), 그리고 cin.ignore() (0) | 2024.08.13 |