std::Vector 반복자 무효화: 삭제 후 모든 반복자 무효화
일반적으로 벡터에서 요소를 지우면 반복자가 가리키는 반복자가 무효화된다는 것이 일반적으로 이해됩니다. 지워진 요소 뒤의 위치로. 그러나 중요한 문제가 발생합니다. 지워진 위치의 반복자가 여전히 유효한가요?
C 표준에 따르면 대답은 '아니오'입니다. 지우기 위해 전달된 반복자 또는 그 이후의 모든 반복자는 무효화됩니다. 이는 벡터에서 홀수 정수를 제거하는 것을 목표로 하는 다음 코드가 정의되지 않은 동작을 초래한다는 것을 의미합니다.
<code class="cpp">typedef std::vector<int> vectype; vectype vec; // Initialize the vector for (int i = 0; i < 100; ++i) vec.push_back(i); vectype::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); // Invalidating iterator else ++it; }</code>
반복을 올바르게 처리
반복을 처리하려면 삭제 후 올바르게 삭제하려면 삭제로 반환된 반복자를 사용하세요. 이 반복자는 지워진 요소 바로 뒤의 요소(또는 요소가 없는 경우 끝)를 가리킵니다.
이 경우 홀수 정수를 제거하는 더 효율적인 접근 방식은 삭제 방법을 사용하는 것입니다. 관용어 제거:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
위 내용은 ## `std::Vector`에서 `erase` 후에는 모든 반복자가 유효하지 않습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!