for (const auto& item : container) {
// item 사용 (읽기 전용, 복사 없음)
}
아래와 거의 같은 코드로 변환되어 동작합니다.
auto&& __range = container;
for (auto __it = begin(__range), __end = end(__range);
__it != __end;
++__it) {
auto&& item = *__it;
// 본문
}
begin(), end(), !=, ++, * 기반 이터레이터 순회입니다.auto 선택 기준 (값/참조)for (auto x : vec) { // 값 복사
// 원본 변경 안 됨
}
for (auto& x : vec) { // 비-const 참조
x *= 2; // 원본 변경
}
for (const auto& x : vec) { // const 참조
// 읽기 전용 + 복사 없음 (권장 기본값)
}
const auto& 권장auto&auto 값 복사가 부담이 적음for (auto& x : v) {
if (x % 2 == 0) {
// v.erase(...); // 위험: 내부 이터레이터 무효화 가능
}
}
insert/erase는 순회 상태를 깨뜨릴 수 있습니다.for (it ... ) { it = erase(it); }erase(remove_if(...), end())range-for는 인덱스를 직접 주지 않습니다. 인덱스가 필요하면 명시적 for가 더 명확합니다.
for (size_t i = 0; i < v.size(); ++i) {
cout << i << ": " << v[i] << '\n';
}
다음이 있으면 기본적으로 동작합니다.
iterator begin();
iterator end();
// const 컨테이너용
const_iterator begin() const;
const_iterator end() const;
begin() == end()인 빈 상태도 정확히 표현되어야 합니다.end()는 마지막 다음 위치(센티널)여야 하며 역참조하면 안 됩니다.| 실수 | 문제 |
|---|---|
for (auto x : bigVec) 습관화 | 매 반복 복사 비용 |
순회 중 erase/push_back 수행 | 이터레이터 무효화 위험 |
수정 의도인데 const auto& 사용 | 컴파일 에러 |
| 인덱스가 필요한데 range-for 고집 | 코드 우회/가독성 저하 |
const auto&가 기본 권장인 이유는?