std::Vector 반복자 무효화: 삭제 후 반복자의 유효성 발굴
C 영역에서 벡터 반복자와 삭제 후의 행동은 혼란의 원인이 될 수 있습니다. 이 문제를 자세히 조사하기 위해 다음과 같은 특정 시나리오를 살펴보겠습니다.
삭제 작업 후 반복자 지속성 유효성 검사
직접 가리키는 반복자의 유효성에 관해 적절한 질문이 제기됩니다. std::Vector의 지워진 요소에. 일반적인 개념은 지워진 요소 뒤의 위치를 가리키는 반복자가 무효화된다는 것입니다. 그러나 질문은 남아 있습니다. 지워진 요소의 정확한 위치를 가리키는 반복자가 여전히 유효한가요?
분석 및 예
이 문제를 밝히려면 다음을 고려하십시오. 벡터에서 모든 홀수 정수를 제거하려고 시도하는 다음 코드 조각:
<code class="cpp">vector<int> vec; for (int i = 0; i < 100; ++i) vec.push_back(i); vector<int>::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); else ++it; }</code>
이 코드는 올바르게 작동하는 것처럼 보일 수 있지만 유효성을 확인하려면 더 깊이 파고드는 것이 중요합니다.
질문에 답하기
대답은 지워진 요소 뒤의 위치를 가리키는 반복자뿐만 아니라 해당 요소의 정확한 위치를 가리키는 반복자도 무효화된다는 점을 명백히 지적합니다.
그러나 요소를 지우면 제거된 요소 바로 뒤를 가리키거나 남은 요소가 없는 경우 끝을 가리키는 반환된 반복자가 제공됩니다. 이를 통해 반복을 원활하게 계속할 수 있습니다.
이상한 요소를 효율적으로 제거
제시된 코드 조각이 이상한 요소를 제거하는 가장 효율적인 방법이 아니라는 점은 주목할 가치가 있습니다. 훨씬 더 효율적인 접근 방식에는 사용자 정의 조건자를 활용하여 제거할 요소를 찾고 식별하는 삭제 제거 관용구가 포함됩니다. 예를 들어, is_odd라는 조건자를 정의하고 이를 제거_if 및 지우기와 함께 사용할 수 있습니다.
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
이렇게 하면 비용이 많이 드는 요소 이동이 제거되어 시간 복잡도가 O(n)으로 줄어듭니다.
위 내용은 ## `std::Vector`에서 지워진 요소에 대한 반복자가 여전히 유효한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!