> 백엔드 개발 > C++ > C에서 반복하는 동안 지도 요소를 안전하게 지우는 방법은 무엇입니까?

C에서 반복하는 동안 지도 요소를 안전하게 지우는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-22 21:22:11
원래의
951명이 탐색했습니다.

How to Safely Erase Map Elements While Iterating in C  ?

반복 중 맵 요소를 지울 때 발생할 수 있는 잠재적인 위험

C에서 맵을 조작할 때 반복하는 동안 요소를 지울 때의 결과를 고려하는 것이 중요합니다. 그들을. 이 질문은 잠재적인 문제를 탐색하고 C 03과 C 11 모두에 대한 솔루션을 제공합니다.

C 03 고려 사항

C 03에서는 지도에서 요소를 삭제해도 문제가 발생하지 않습니다. 맵의 모든 반복자를 자동으로 무효화합니다. 그러나 삭제된 요소를 가리키는 반복자는 무효화됩니다. 맵을 안전하게 반복하고 반복 중에 요소를 지우려면 지우기를 호출하기 전에 반복자를 증가시켜야 합니다. 질문에 제공된 코드의 업데이트된 버전은 다음과 같습니다.

map<string, SerialdMsg::SerialFunction_t><string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        port_map.erase(pm_it++);  // Use post-increment to get the updated iterator.
    } else {
        ++pm_it;  // Can use pre-increment for efficiency.
    }
}
로그인 후 복사

C 11 Enhancements

C 11에서는 erasure() 메서드가 크게 개선되었습니다. 이제 맵의 다음 요소를 가리키는 반복자를 반환하므로 다른 반복자를 무효화하지 않고 반복 중에 요소를 안전하게 지울 수 있습니다. C 11을 사용하는 업데이트된 코드는 다음과 같습니다.

auto pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        pm_it = port_map.erase(pm_it);
    } else {
        ++pm_it;
    }
}
로그인 후 복사

Mark Ransom 기술

Mark Ransom 기술은 반복 중에 지도 요소를 안전하게 삭제하기 위한 C 03의 또 다른 옵션입니다. . 삭제할 요소의 키를 저장하기 위한 임시 벡터를 생성한 다음 두 번째 루프에서 삭제하는 작업이 포함됩니다.

결론적으로 C에서 반복하는 동안 맵에서 요소를 지울 때는 잠재적인 가능성을 고려하세요. 반복자를 무효화하고 사용 중인 C 버전에 따라 적절한 접근 방식을 사용하십시오. 일관성을 유지하고 예상치 못한 동작을 방지하려면 요소를 삭제하기 전에 항상 반복자를 증가시키는 것을 잊지 마세요.

위 내용은 C에서 반복하는 동안 지도 요소를 안전하게 지우는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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