> 백엔드 개발 > C++ > C++ 오류: 반복자가 만료되었습니다. 어떻게 해결합니까?

C++ 오류: 반복자가 만료되었습니다. 어떻게 해결합니까?

WBOY
풀어 주다: 2023-08-22 17:37:47
원래의
1504명이 탐색했습니다.

C++ 오류: 반복자가 만료되었습니다. 어떻게 해결합니까?

C++ 프로그래밍에서 반복자(Iterator)를 사용하는 것은 컨테이너의 요소를 순회하는 일반적인 방법입니다. 그러나 컨테이너를 순회할 때 반복자가 만료되어 프로그램이 중단되거나 예기치 않은 결과가 발생하는 문제가 발생하는 경우가 있습니다.

그렇다면 이터레이터가 만료된 문제는 무엇인가요? 간단히 말해서, 반복자를 사용하여 컨테이너를 순회할 때 컨테이너가 수정되면(예: 요소 추가 또는 삭제 등) 반복자가 유효하지 않게 될 수 있습니다. 즉, 반복자가 가리키는 요소는 no입니다. 더 이상 존재하지 않거나 위치가 변경된 경우 반복자를 다시 사용하면 오류가 발생합니다.

반복자가 만료된 문제를 해결하는 방법은 무엇입니까? 다음은 몇 가지 일반적인 해결 방법입니다.

1. 제거 기능 대신 지우기 기능을 사용하세요.

컨테이너 요소를 사용하는 작업에서는 제거 및 지우기 기능이 자주 사용됩니다. 둘 다 컨테이너의 요소를 삭제하는 데 사용할 수 있습니다. 그러나 제거 기능은 삭제할 요소를 컨테이너 끝으로 이동시킬 뿐 실제로 요소를 삭제하지는 않지만, 지우기 기능은 실제로 컨테이너에서 요소를 삭제합니다. 따라서 컨테이너 순회 시 요소를 삭제하려면 반복자가 만료되지 않도록 삭제 기능을 사용하는 것이 가장 좋습니다.

2. auto 키워드 사용

C++11에는 반복자 유형을 자동으로 추론할 수 있는 auto 키워드가 도입되었습니다. auto 키워드를 사용하면 컴파일러는 반복자 유형을 자동으로 일치시켜 반복자가 컨테이너 유형과 일치하는지 확인함으로써 유형 불일치 문제를 방지합니다.

예:

vector<int> v = {1,2,3,4,5};
for(auto it = v.begin(); it != v.end(); ++it){
    // ...
}
로그인 후 복사

auto 키워드를 사용하면 컴파일러는 반복자의 유형을 자동으로 추론하여 컨테이너 유형과 일치하는지 확인할 수 있습니다.

3. 컨테이너 수정 시 올바른 반복자를 사용하세요

컨테이너 수정 시 올바른 반복자를 사용해야 합니다. 예를 들어 벡터 컨테이너를 순회할 때 요소를 삭제하려면 지우기 기능을 사용해야 하는데, 지우기 기능을 사용하면 요소 뒤의 모든 요소의 위치가 변경됩니다. 이전 반복자를 계속 사용하여 이동된 요소를 가리키는 경우 반복자는 유효하지 않게 됩니다.

이 상황을 방지하려면 삭제 작업을 수행하기 전에 먼저 삭제할 요소 위치의 반복자를 기록하고 이 반복자 뒤의 위치로 반복자를 업데이트하여 반복자가 여전히 올바른 위치를 가리키도록 할 수 있습니다. 샘플 코드는 다음과 같습니다.

vector<int> v = {1,2,3,4,5};
auto it = v.begin() + 2; // 记录要删除的元素位置
v.erase(it); // 删除元素
it = v.begin() + 2; // 更新迭代器
로그인 후 복사

이는 반복자가 여전히 올바른 위치를 가리키도록 보장하고 반복자 실패 문제를 방지합니다.

간단히 말하면, C++ 프로그램을 작성할 때 반복자를 사용하여 컨테이너를 순회하는 것은 매우 일반적인 작업입니다. 그러나 반복자 실패는 매우 일반적인 문제이므로 프로그램의 정확성을 보장하기 위해 이 문제를 방지하도록 주의를 기울여야 합니다.

위 내용은 C++ 오류: 반복자가 만료되었습니다. 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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