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