std::Vector::erase()의 반복자 무효화 이해
이 토론에서는 다음과 같은 경우 반복자 무효화에 대한 주제를 탐구합니다. std::벡터::erase()를 호출합니다. 이전 논쟁에서 알려진 바와 같이, 벡터에서 요소를 지우면 지워진 요소 뒤에 위치한 반복자가 무효화된다는 것이 확립되었습니다. 그러나 질문이 생깁니다. 지워진 요소에 위치한 반복자는 여전히 유효한 것으로 간주됩니까?
지워진 위치에 있는 반복자는 계속 사용할 수 있어야 한다는 직관적 이해에도 불구하고 정확한 동작이 항상 명확하지는 않습니다. 이 개념을 설명하기 위해 벡터에서 모든 홀수 정수를 제거하는 다음 코드 조각을 분석해 보겠습니다.
<code class="cpp">typedef std::vector<int> vectype; vectype vec; 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); else ++it; }</code>
이 코드는 성공적으로 실행되지만 모범 사례를 위반합니다. C 표준에 따르면, erasure()는 매개변수로 제공된 반복자 또는 그 이후의 모든 반복자를 무효화합니다. 이 경우에는 지워진 위치의 반복자가 유효하지 않게 된다는 의미입니다.
그러나 erase()는 지워진 요소 바로 다음 요소나 vec.end를 가리키는 새 반복자를 편리하게 반환합니다. () 해당 요소가 존재하지 않는 경우. 이 새로운 반복자를 활용하면 반복을 안전하게 재개할 수 있습니다.
앞서 언급한 홀수 요소를 제거하는 방법은 효율적이지 않다는 점에 유의하는 것이 중요합니다. 요소가 삭제될 때마다 후속 요소가 벡터에서 왼쪽으로 이동해야 하므로 O(n2) 복잡도가 발생합니다. 이 작업은 O(n)에서 작동하는 지우기-제거 관용구를 사용하여 보다 효율적으로 수행할 수 있습니다. is_odd()와 같은 조건자를 생성하여 지우기 작업을 개선할 수 있습니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!