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