> 백엔드 개발 > C++ > 본문

## **`std::벡터::erase`-반환된 반복자는 제거 후 유효한 요소를 가리킵니까?**

Barbara Streisand
풀어 주다: 2024-10-25 13:11:30
원래의
296명이 탐색했습니다.

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!