Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 반복자 무효화

<시간/>

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는 이전 주소를 가리킬 것입니다. 이를 위해 일부 무효화를 생성할 수 있습니다.

반복자 무효화에 대한 몇 가지 규칙을 살펴보겠습니다.

<머리><스타일="너비:20.4762%;">
삽입
지우기
크기 조정
벡터
삽입 지점 이전의 요소를 가리키는 모든 반복자는 영향을 받지 않지만 다른 반복자는 무효화됩니다. 그리고 벡터의 크기가 증가하면 모든 반복자가 무효화됩니다.
삭제 지점 이후에 있는 모든 반복자와 참조가 무효화됩니다.
삽입 또는 지우기와 동일합니다.
데크
삽입된 항목이 데크 끝에 삽입되지 않으면 모든 반복자와 참조가 무효화됩니다.
항목이 끝 위치를 제외한 위치에서 삭제되면 모든 반복자가 무효화됩니다.
삽입 또는 지우기와 동일합니다.
목록
모든 반복자와 참조는 영향을 받지 않습니다.
지울 요소를 가리키는 반복자 또는 참조만 영향을 받습니다.
삽입 또는 지우기와 동일합니다.
설정, 지도, 다중 집합, 다중 지도
모든 반복자와 참조는 영향을 받지 않습니다.
지울 요소를 가리키는 반복자 또는 참조만 영향을 받습니다.
----