ホームページ >バックエンド開発 >C++ >C で逆反復子を使用してリストから要素を削除するにはどうすればよいですか?

C で逆反復子を使用してリストから要素を削除するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-30 18:55:14488ブラウズ

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

逆反復子を使用したリストからの要素の削除

リストから要素を削除したいというシナリオが発生する可能性があります。 list は逆反復子を使用しますが、erase() 関数は通常の反復子のみを受け入れます。逆反復子を通常の反復子に変換するのは簡単ではないため、これは課題となる可能性があります。

解決策:

この問題を解決する鍵は、関係を理解することにあります。逆反復子とその基本反復子の間。 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() をデクリメントすることによって取得されます。この基本反復子を Erase() 関数に渡すことで、リストから目的の要素を正常に削除できます。

C 11 ソリューション:

C 11 以降の場合、さらに 2 つのソリューションが利用可能です:

  1. 使用std::next():
m_CursorStack.erase( std::next(i).base() );

このソリューションは変更されませんが、 std::next() は逆反復子を 1 つ前に進めるために使用され、その基本反復子を効果的に取得します。 .

  1. リバースを進めるIterator:
std::advance(i, 1);
m_CursorStack.erase( i.base() );

このソリューションでは、std::advance() を使用して逆反復子を 1 位置進めます。これにより、基本反復子が消去対象の要素と効果的に位置合わせされます。

どのソリューションを選択しても、これらのアプローチは、リバースを使用してリストから要素を消去するためのクリーンで簡単な方法を提供します。イテレータ。

以上がC で逆反復子を使用してリストから要素を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。