프로그래밍C++ 개발자

C++ STL에서 이터레이터란 무엇이며, 어떤 종류가 존재하며 프로그래밍 시 알아야 할 주의사항은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변

이터레이터는 STL 컨테이너의 요소를 포인터처럼 참조할 수 있게 해주는 객체입니다. 이들은 모든 컨테이너(벡터, 리스트, 맵 등)의 요소에 대한 통합된 액세스 방법을 제공합니다. 이터레이터는 여러 종류가 있습니다:

  • InputIterator — 순서를 앞으로 읽기 위한 이터레이터입니다.
  • OutputIterator — 순서에 값을 기록하기 위한 이터레이터입니다.
  • ForwardIterator — 앞으로 읽고 쓸 수 있으며 (OutputIterator보다 오래 살아남습니다).
  • BidirectionalIterator — 앞으로와 뒤로 모두 이동할 수 있는 이터레이터입니다.
  • RandomAccessIterator — 임의 접근을 지원합니다 (예: std::vector::iterator).

이터레이터의 생명 주기에 특별히 유의해야 합니다:

  • 컨테이너가 변경될 때 이터레이터가 무효화될 수 있습니다. 예를 들어, 벡터에 요소를 삽입하면 이전 이터레이터가 무효화될 수 있습니다.
  • 다양한 컨테이너가 이터레이터의 생명 주기를 다르게 관리합니다. std::list에서는 삽입 또는 삭제가 다른 이터레이터를 무효화하지 않지만, std::vector에서는 거의 항상 무효화됩니다.

예제:

std::vector<int> v = {1,2,3,4,5}; for (auto it = v.begin(); it != v.end(); ++it) { if (*it == 3) { // 값이 3인 요소를 삭제합니다. it = v.erase(it); // erase는 다음 요소에 대한 이터레이터를 반환합니다. --it; // 필요 시 이터레이터를 조정합니다. } }

함정 질문

질문: std::vector::insert를 호출할 때 이터레이터가 무효화됩니까?
빈번한 답변: 아니요, 끝 범위를 초과하여 추가할 때만입니다.
정확한 답변: 삽입 위치보다 크거나 같은 모든 이터레이터와 참조가 무효화되며, 컨테이너의 용량이 증가할 경우에만 발생합니다. 용량이 충분하다면 — 삽입 지점 이후 범위의 이터레이터만 무효화됩니다.

예제:

std::vector<int> v = {1,2,3}; auto it = v.begin() + 1; v.insert(v.begin(), 0); // 여기서 it는 무효화될 수 있습니다!

주제에 대한 미숙지로 인한 실제 오류 예시


이야기: 프로젝트에서 std::vector를 반복하기 위해 포인터를 사용했으며, push_back 후 무효화된 포인터를 이용하여 반복을 계속하며 애플리케이션이 충돌했습니다.



이야기: 개발자가 for(auto it : list)에서 erase를 통해 std::list의 요소를 삭제했으며, 반환된 erase 이터레이터를 사용하지 않았기 때문에 반복이 요소를 건너뛰었고 필요한 모든 요소가 삭제되지 않았습니다.



이야기: 코드에서 std::map을 사용했으며, 키를 기준으로 erase 후 이터레이터가 삭제된 요소에 묶여있어 (정의되지 않은 동작), 이후 접근 시 무작위로 실패했습니다.