>  기사  >  백엔드 개발  >  반복 중에 std::벡터에서 요소를 안전하게 제거하는 방법은 무엇입니까?

반복 중에 std::벡터에서 요소를 안전하게 제거하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-30 07:35:02337검색

How to Safely Remove Elements from a std::vector During Iteration?

반복 중 std::Vector에서 요소 제거

요소 벡터가 있고 이를 반복하는 동안 항목을 제거해야 하는 경우 , erasure() 메서드는 문제를 일으킬 수 있습니다. 요소를 지우면 후속 요소를 가리키는 모든 반복자가 무효화됩니다.

반복자와 삭제()

다음 코드를 고려하세요.

<code class="cpp">std::vector<std::string> m_vPaths;
...
for (auto iter = m_vPaths.begin(); iter != m_vPaths.end(); iter++) {
  std::string strPath = *iter;
  if (::DeleteFile(strPath.c_str())) {
    m_vPaths.erase(iter);
    // Iterators become invalid after erase
  }
}</code>

다음 코드를 고려하세요. 처음으로 파일 삭제에 성공하면 다음 요소를 가리키는 반복자가 유효하지 않게 됩니다. 이는 반복의 연속을 복잡하게 만듭니다.

두 개의 벡터 사용

한 가지 해결책은 두 개의 벡터를 사용하는 것입니다. 하나는 반복하고 다른 하나는 삭제할 요소를 저장하는 것입니다. . 이것이 작동하는 동안 추가적인 메모리 오버헤드와 복잡성이 발생합니다.

대체 데이터 구조

반복 중에 요소를 제거하는 데 더 적합한 데이터 구조는 다음과 같습니다.

  • std::set> (정렬되고 고유하며 자연스럽게 내림차순으로 정렬됨)
  • std::unordered_set (순서가 없고 고유함)

이러한 구조는 정렬되거나 순서가 지정되지 않은 값 컬렉션을 유지하며 제거해도 다른 요소가 무효화되지 않습니다.

std::remove_if 사용

또는 std::remove_if() 알고리즘을 사용하여 벡터에서 특정 요소를 삭제하기 전에 제거할 수 있습니다. 이렇게 하면 반복자가 유효한 상태로 유지됩니다.

<code class="cpp">auto iter_new_end = std::remove_if(m_vPaths.begin(), m_vPaths.end(),
  [](const std::string& strPath) {
    return ::DeleteFile(strPath.c_str());
  });
m_vPaths.erase(iter_new_end, m_vPaths.end());</code>

결론

특정 요구 사항에 따라 다음 중에서 최상의 접근 방식을 선택할 수 있습니다.

  • 반복자 사용 시 주의사항
  • 두 개의 벡터 유지
  • 대체 데이터 구조 활용
  • std::remove_if() 사용

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

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