逆反復子を使用したリストからの要素の削除
リストから要素を削除したいというシナリオが発生する可能性があります。 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 つのソリューションが利用可能です:
m_CursorStack.erase( std::next(i).base() );
このソリューションは変更されませんが、 std::next() は逆反復子を 1 つ前に進めるために使用され、その基本反復子を効果的に取得します。 .
std::advance(i, 1); m_CursorStack.erase( i.base() );
このソリューションでは、std::advance() を使用して逆反復子を 1 位置進めます。これにより、基本反復子が消去対象の要素と効果的に位置合わせされます。
どのソリューションを選択しても、これらのアプローチは、リバースを使用してリストから要素を消去するためのクリーンで簡単な方法を提供します。イテレータ。
以上がC で逆反復子を使用してリストから要素を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。