>백엔드 개발 >C++ >C에서 역방향 반복자를 사용하여 목록에서 요소를 어떻게 지울 수 있습니까?

C에서 역방향 반복자를 사용하여 목록에서 요소를 어떻게 지울 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-30 18:55:14491검색

How Can I Erase an Element from a List Using a Reverse Iterator in C  ?

역방향 반복자를 사용하여 목록에서 요소 삭제

목록에서 요소를 제거하려는 시나리오가 발생할 수 있습니다. 역방향 반복자를 사용하여 나열하지만, ​​eraser() 함수는 일반 반복자만 허용합니다. 역방향 반복자를 일반 반복자로 변환하는 것이 간단하지 않기 때문에 이는 어려울 수 있습니다.

해결책:

이 문제를 해결하는 열쇠는 관계를 이해하는 데 있습니다. 역방향 반복자와 기본 반복자 사이. C 표준에 따르면 역방향 반복자 i의 기본 반복자는 &*(i - 1)입니다. 즉, 기본 반복자를 얻으려면 i를 감소시킵니다.

예:

다음 코드 조각을 고려하세요.

for ( std::list< Cursor::Enum & >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i )
{
    if ( *i == pCursor )
    {
        m_CursorStack.erase( --(i.base()) );
        break;
    }
}

여기서 예를 들어 기본 반복자는 i.base()를 감소시켜 얻습니다. 이 기본 반복자를 erame() 함수에 전달하면 목록에서 원하는 요소를 성공적으로 제거할 수 있습니다.

C 11 솔루션:

C 11 이상 , 두 가지 추가 솔루션을 사용할 수 있습니다:

  1. 사용 std::next():
m_CursorStack.erase( std::next(i).base() );

이 솔루션은 변경되지 않은 반면 std::next()는 역방향 반복기를 한 단계 앞으로 이동하여 기본 반복기를 효과적으로 검색하는 데 사용됩니다. .

  1. 역전의 전진 반복자:
std::advance(i, 1);
m_CursorStack.erase( i.base() );

이 솔루션에서 역방향 반복자는 std::advance()를 사용하여 한 위치 전진합니다. 이는 기본 반복자를 삭제하려는 요소와 효과적으로 정렬합니다.

어떤 솔루션을 선택하든 이러한 접근 방식은 역방향을 사용하여 목록에서 요소를 지우는 깨끗하고 간단한 방법을 제공합니다. 반복자.

위 내용은 C에서 역방향 반복자를 사용하여 목록에서 요소를 어떻게 지울 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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