>백엔드 개발 >C++ >## `std::Vector`에서 `erase` 후에는 모든 반복자가 유효하지 않습니까?

## `std::Vector`에서 `erase` 후에는 모든 반복자가 유효하지 않습니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-25 10:43:30685검색

## Are All Iterators Invalid After `erase` on a `std::vector`?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.