>백엔드 개발 >C++ >반복 중에 C 맵에서 요소를 안전하게 제거하려면 어떻게 해야 합니까?

반복 중에 C 맵에서 요소를 안전하게 제거하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-09 13:52:14365검색

How Can I Safely Remove Elements from a C   Map During Iteration?

반복 중 맵에서 요소 제거

C에서는 지우기를 사용하여 요소를 제거하는 동안 표준 라이브러리 맵을 반복하는 것이 어려울 수 있습니다. ()는 반복자를 무효화합니다. 그러나 이 문제를 해결하기 위해 널리 사용되는 관용구가 있습니다.

for(auto it = m.begin(); it != m.cend() /* not hoisted */; /* no increment */)
{
  if(must_delete)
  {
    auto next = it;
    it = m.erase(it);      // or "it = m.erase(it)" since C++11
  }
  else
  {
    ++it;
  }
}

이 관용구의 작동 방식은 다음과 같습니다.

  • 호이스팅 없음: 호이스트하지 않습니다. 루프 조건 밖의 증분 연산자. 호이스팅을 수행하면 요소가 제거되더라도 반복자가 계속 진행되어 잠재적으로 정의되지 않은 동작이 발생할 수 있으므로 이는 매우 중요합니다.
  • 안전하게 증분: 루프 내에서는 증분 연산자만 적용됩니다. 해당 요소를 제거하면 안되는지 확인한 후
  • 다음 반복자 캐싱(C 11 또는 나중에): 요소가 제거되면 삭제하기 전에 반복자를 다음 요소에 캐시합니다. 이를 통해 반복자 시퀀스를 중단하지 않고 원활하게 반복을 계속할 수 있습니다.

C 11 이전 구문:

C 11 이전에는 const 반복자를 삭제하는 데 약간의 시간이 필요했습니다. 다른 구문:

for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }

불변성 및 제거:

맵에서 요소를 삭제해도 상수에 대한 포인터를 삭제하는 것과 마찬가지로 요소의 불변성을 위반하지 않습니다. 일관성은 주로 수명이 아니라 값을 수정하는 능력을 제한합니다.

위 내용은 반복 중에 C 맵에서 요소를 안전하게 제거하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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