> 백엔드 개발 > C++ > 특정 조건부 확인 없이 반복자를 사용하여 벡터 요소를 지우면 충돌이 발생하는 이유는 무엇입니까?

특정 조건부 확인 없이 반복자를 사용하여 벡터 요소를 지우면 충돌이 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-07 12:25:13
원래의
1004명이 탐색했습니다.

Why Does Erasing Vector Elements with an Iterator Crash Without a Specific Conditional Check?

추가 조건 검사 없이 "벡터 지우기 반복자" 코드가 충돌하는 이유는 무엇입니까?

다음 코드를 고려하십시오.

vector<int> res;
res.push_back(1);
vector<int>::iterator it = res.begin();
for( ; it != res.end(); it++)
{
    it = res.erase(it);
}
로그인 후 복사

이 코드는 반복자를 사용하여 벡터에서 모든 요소를 ​​지우려고 시도합니다. 그러나 다음과 같은 추가 조건 확인 없이 충돌이 발생합니다.

if(it == res.end())
    return 0;
로그인 후 복사

설명

지우기 함수는 지워진 요소 뒤의 다음 요소를 가리키는 반복자를 반환합니다. 마지막 요소가 지워지면 반환된 반복자는 res.end()와 같습니다.

원본 코드에서는 조건부 확인 없이 for 루프는 요소의 끝에 도달한 후에도 반복자를 계속 증가시킵니다. 벡터. 이로 인해 벡터 경계를 넘어 메모리에 액세스하려는 시도가 발생하여 충돌이 발생합니다.

조건부 확인을 사용하면 반복자가 벡터의 끝에 도달하면 루프가 종료됩니다(it == res. 끝()). 이렇게 하면 충돌이 방지됩니다.

대체 루프 구조

조건부 확인이 필요하지 않도록 다음과 같이 루프를 다시 작성할 수 있습니다.

while (it != res.end())
{
    it = res.erase(it);
}
로그인 후 복사

이 루프는 res.end()에 도달하면 자동으로 종료됩니다. 조건이 더 이상 유지되지 않기 때문입니다. true.

추가 고려 사항

요소를 조건부로 지울 때 요소가 지워지지 않으면 수동으로 반복자를 증가시켜야 합니다. 이는 다음을 사용하여 달성할 수 있습니다:

for ( ; it != res.end(); )
{
   if (condition) 
        it = res.erase(it);
   else 
        ++it;
}
로그인 후 복사

위 내용은 특정 조건부 확인 없이 반복자를 사용하여 벡터 요소를 지우면 충돌이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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