>백엔드 개발 >C++ >C 11에서 반복하는 동안 벡터에서 요소를 안전하게 제거하는 방법은 무엇입니까?

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-28 20:56:11376검색

How to Safely Remove Elements from a Vector While Iterating in C  11?

C 11 범위 기반 루프 중 벡터에서 요소 제거

C 11의 범위 기반 for 루프는 반복하는 편리한 방법을 제공합니다. 특히 각 요소에 대해 작업을 수행해야 하는 경우 컨테이너의 요소입니다. 그러나 벡터를 다룰 때 벡터를 반복하는 동안 벡터에서 요소를 제거해야 하는 경우가 있습니다.

문제

다음 코드를 고려하세요.

std::vector<IInventory*> inv;
inv.push_back(new Foo());
inv.push_back(new Bar());

for (IInventory* index : inv)
{
    // Do some stuff
    // ...
}

루프 내부에서 벡터 inv의 특정 요소를 제거해야 한다는 것을 알게 되었습니다. 그러나 두 가지 문제가 발생합니다.

  1. 요소를 제거할 수 없음: 범위 기반 for 루프는 벡터를 반복하는 동안 벡터를 수정하는 방법을 제공하지 않습니다.
  2. 루프 유효성: 벡터에서 요소를 제거하면 잠재적으로 벡터가 무효화될 수 있습니다. loop.

솔루션

범위 기반 for 루프는 컨테이너의 각 요소에 한 번만 액세스해야 하는 상황을 위해 고안되었습니다. 반복 중에 요소를 수정하거나 제거해야 하는 경우 기존 for 루프나 반복자 기반 변형 중 하나를 사용해야 합니다.

반복기 증분 관리 기능이 있는 기존 for 루프를 사용하여 코드를 수정하는 방법은 다음과 같습니다.

for (auto i = inv.begin(); i != inv.end(); /*++i*/) {
    // Do stuff
    if (should_remove) {
        i = inv.erase(i);
    } else {
        ++i;
    }
}

반복기 증분을 명시적으로 관리함으로써 루프의 유효성을 유지하고 어떤 문제도 발생하지 않고 요소를 제거하고 수정할 수 있는지 확인합니다. 오류가 발생했습니다.

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

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