3

事実上プロキシであり、それが返すデータを含む反復子がある場合、逆反復子を作成するにはどうすればよいでしょうか?

逆参照演算子の std::reverse_iterator 実装は、次のようなコードを使用して、デクリメントおよび逆参照する一時オブジェクトを作成します。

  reference operator*() const {
    iterator tmp = current;
    return *--tmp;
  }

その結果、返されるのは、データを取得する前に範囲外になるデータへのポインターです。

これはかなり残念な結果です。

どうすればこれを回避できますか?

4

2 に答える 2

1

あなたのイテレータ型はreverse_iteratorのこの特定の実装と互換性がないため、この特定のケースのために独自のカスタム逆イテレータ実装を書く必要があるようです。

http://en.cppreference.com/w/cpp/iterator/reverse_iteratorによると、一部の実装ではイテレータのデクリメントされたコピーも格納されますが、すべてではありません。Boost::reverse_iterator は追加のコピーを保存していないようです。

于 2014-01-09T10:22:58.897 に答える
1

標準ライブラリの実装が間違っていると思います。C++11 標準の 24.5.1.3.4 [reverse.iter.op.star] を見ると、次のことがわかります。

deref_tmp = current;
--deref_tmp;
return *deref_tmp;

注: この操作では、一時変数ではなく補助メンバー変数を使用して、関連付けられた反復子の有効期間を超えて持続する参照を返さないようにする必要があります。

標準deref_tmpでは、 の for-exposition-only データ メンバーですreverse_iterator

于 2014-01-09T10:28:17.093 に答える