"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > ## **`std::벡터::erase`-반환된 반복자는 제거 후 유효한 요소를 가리킵니까?**

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

2024-11-09에 게시됨
검색:418

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

std::Vector 반복자의 무효화: 자세한 설명

std::Vector의 반복자 무효화 개념은 자주 논의되어 왔습니다. 명확히 하자면, std::Vector::erase를 통한 벡터 요소의 삭제는 지워진 요소 바로 뒤에 위치한 반복자를 무효화합니다.

그러나 지워진 요소의 정확한 위치에 있는 반복자의 유효성은 여전히 ​​불확실합니다. 논리적으로 벡터의 기본 구현은 일반적으로 나머지 요소를 이동하여 빈 공간을 채우기 때문에 이 반복자가 유효하다고 가정할 수 있습니다. 그러나 정의되지 않은 결과에 대한 정확한 동작과 가능성은 덜 확실합니다.

벡터에서 홀수 정수를 제거하는 방법을 보여주는 다음 예를 고려하세요.

typedef std::vector vectype;
vectype vec;

for (int i = 0; i 

이 코드는 실제로는 오류 없이 실행되는 것처럼 보이지만 유효성은 여전히 ​​논쟁의 여지가 있습니다.

답은 지우기 동작에 있습니다. 실제로 반복기에서 또는 그 이후의 모든 반복기를 무효화합니다( s) 지우기 위해 전달되었습니다. 그러나 지워진 요소 바로 뒤 또는 그러한 요소가 존재하지 않는 경우 끝 부분에 새로운 반복자를 반환하기도 합니다. 이 반복자를 사용하여 반복을 재개할 수 있습니다.

위의 홀수 정수 제거 방법은 비효율적입니다(O(n2)). 각 삭제에는 모든 항목의 이동이 필요하기 때문입니다. 후속 요소. 지우기-제거 관용구는 훨씬 더 효율적인 솔루션을 제공합니다(O(n)):

bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3