C++에는 vector, list, set, map 등과 같은 다른 컨테이너가 있습니다. 이러한 컨테이너를 반복하기 위해 반복자를 사용할 수 있습니다. C++에서 반복자를 사용할 때 주의해야 합니다. 컨테이너에 대해 반복을 사용할 때 때때로 무효화될 수 있습니다. 모양, 크기가 변경되면 이러한 문제에 직면할 수 있습니다. 다음 예에서 무효화 문제를 식별할 수 있습니다.
예시 코드
#include <iostream> #include <vector> using namespace std; int main() { vector <int> vec{11, 55, 110, 155, 220}; for (auto it=vec.begin(); it!=vec.end(); it++) if ((*it) == 110) vec.push_back(89); //inserting a new value while iterating the vector for (auto it=vec.begin();it!=vec.end();it++) cout << (*it) << " "; }
출력
11 55 110 155 220 89 89
이 프로그램에서는 다양한 결과를 얻을 수 있습니다. 여기서 벡터의 크기는 이전에 정의되지 않았습니다. 초기화를 위해 일부 값이 제공됩니다. 이제 반복하는 동안 값을 하나 더 추가합니다. 이 경우 벡터에 공간이 없으면 런타임에 새 메모리 블록이 생성되고 모든 항목이 복사됩니다. 그러나 iterator는 이전 주소를 가리킬 것입니다. 이를 위해 일부 무효화를 생성할 수 있습니다.
반복자 무효화에 대한 몇 가지 규칙을 살펴보겠습니다.
삽입 | 지우기 | 크기 조정 | |
---|---|---|---|
벡터 | 삽입 지점 이전의 요소를 가리키는 모든 반복자는 영향을 받지 않지만 다른 반복자는 무효화됩니다. 그리고 벡터의 크기가 증가하면 모든 반복자가 무효화됩니다. | 삭제 지점 이후에 있는 모든 반복자와 참조가 무효화됩니다. | 삽입 또는 지우기와 동일합니다. |
데크 | 삽입된 항목이 데크 끝에 삽입되지 않으면 모든 반복자와 참조가 무효화됩니다. | 항목이 끝 위치를 제외한 위치에서 삭제되면 모든 반복자가 무효화됩니다. | 삽입 또는 지우기와 동일합니다. |
목록 | 모든 반복자와 참조는 영향을 받지 않습니다. | 지울 요소를 가리키는 반복자 또는 참조만 영향을 받습니다. | 삽입 또는 지우기와 동일합니다. |
설정, 지도, 다중 집합, 다중 지도 | 모든 반복자와 참조는 영향을 받지 않습니다. | 지울 요소를 가리키는 반복자 또는 참조만 영향을 받습니다. | ---- |