std::Vector 반복자 무효화: 자세한 설명
std::Vector의 반복자 무효화 개념은 자주 논의되어 왔습니다. 명확히 하자면, std::Vector::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>
이 코드는 실제로는 오류 없이 실행되지만 그 타당성은 여전히 논쟁의 여지가 있습니다.
답은 지우기 동작에 있습니다. 실제로 지우기 위해 전달된 반복자 또는 그 이후의 모든 반복자를 무효화합니다. 그러나 삭제된 요소 바로 뒤 또는 해당 요소가 없는 경우 끝 부분에 새 반복자를 반환합니다. 이 반복자를 사용하여 반복을 재개할 수 있습니다.
위의 홀수 정수 제거 방법은 비효율적입니다(O(n2)). 각 삭제에는 모두 시프트가 필요하기 때문입니다. 후속 요소. 지우기-제거 관용구는 훨씬 더 효율적인 솔루션(O(n))을 제공합니다.
<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::벡터::erase`-반환된 반복자는 제거 후 유효한 요소를 가리킵니까?**의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!