>백엔드 개발 >C++ >반복하는 동안 `std::set`에서 요소를 지우는 것이 안전하며 올바르게 수행하는 방법은 무엇입니까?

반복하는 동안 `std::set`에서 요소를 지우는 것이 안전하며 올바르게 수행하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-11 09:47:18545검색

Is Erasing Elements from a `std::set` While Iterating Safe and How to Do It Correctly?

반복하는 동안 std::set에서 요소 삭제: 안전한가요?

세트를 반복하고 특정 기준을 충족하는 요소를 제거하는 것은 C 프로그래밍의 일반적인 작업입니다. 그러나 반복하는 동안 요소를 지우는 동작은 반복기 무효화에 대한 우려를 불러일으킬 수 있습니다.

제공된 코드 조각에서는 정수 집합을 반복하고 짝수를 지웁니다. 이 코드는 작동하는 것처럼 보이지만 구현별 동작에 의존합니다. C 표준은 반복하는 동안 집합에서 요소가 지워질 때 어떤 일이 발생하는지 명시적으로 지정하지 않습니다.

표준 준수 접근 방식

이식성을 보장하고 신뢰성이 높으면 표준 준수 접근 방식을 사용하는 것이 좋습니다.

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        numbers.erase(it++);
    }
    else {
        ++it;
    }
}

이 접근 방식은 후위 증분 연산자 it 을 사용합니다. 지우기 위해 이전 반복자를 전달하지만 반환하기 전에 다음 요소를 가리키도록 진행합니다. 결과적으로 루프가 올바르게 반복되고 반복자는 각 지우기 작업 후에도 유효한 상태로 유지됩니다.

C 11 솔루션

C 11은 다음과 같은 집합에 대한 업데이트된 지우기 방법을 도입했습니다. 반복하는 동안 요소를 지우는 프로세스를 단순화합니다.

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}

이 접근 방식은 지우기 방법을 사용합니다. 지워진 요소 다음의 요소에 대한 반복자를 반환합니다(또는 마지막 요소가 지워진 경우 set::end). 이렇게 하면 후위 증분을 사용할 필요가 없고 각 삭제 작업 후에도 유효한 상태로 유지되므로 루프가 단순화됩니다.

결론

초기 코드 조각은 다음에서 작동할 수 있습니다. 일부 구현에서는 구현별 동작에 의존하는 것이 일반적으로 권장되지 않습니다. 표준 준수 접근 방식 또는 C 11 삭제 방법을 사용하면 코드가 다양한 컴파일러 및 플랫폼에서 올바르게 이식 가능하게 작동하는지 확인할 수 있습니다.

위 내용은 반복하는 동안 `std::set`에서 요소를 지우는 것이 안전하며 올바르게 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.