1. ホーム
  2. c++

[解決済み】逆イテレータでeraseを呼び出す方法

2022-04-09 04:28:14

質問

このようなことをしようとしています。

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

しかし、erase はイテレータを取り、逆イテレータは取りません。逆イテレータを通常のイテレータに変換する方法、またはリストからこの要素を削除する他の方法はありますか?

どのように解決するのですか?

さらに調べてテストした結果、解決策が見つかりました。どうやら規格[24.4.1/1]によると、i.base()とiの関係は次のようになっている。

&*(reverse_iterator(i)) == &*(i - 1)

から ドブス博士の記事 ):

そのため、base()を取得する際にオフセットを適用する必要があります。したがって、解決策は

m_CursorStack.erase( --(i.base()) );

EDIT

C++11用にアップデートしました。

リバースイテレータ i は変更しない。

m_CursorStack.erase( std::next(i).base() );

リバースイテレータ i が進んでいます。

std::advance(i, 1);
m_CursorStack.erase( i.base() );

私は、この方法が以前の解決策よりもずっと分かりやすいと思います。お好きなほうをお使いください。