質問

書いた疎ベクタークラスの参照 #1, #2.)

また二種類の反復子:

最初のセットの反復子は、点の任意の要素から設定設定.ばから読み取れますが、いずれの設定値は value_type(), れば、書き込まれ、その要素を返しlvalueます。このように、い

ランダムアクセスの反復子のトラバーサル読み取書き込み可能 反復子

第二に、疎反復子,対し繰り返し操作を行うだけのセットです。以降する必要がないの遅延を要素を記録することはありますが、それは

ランダムアクセスの反復子のトラバーサル読み取書き込み可能Lvalue 反復子

また必要性定数のバージョンの両方のない書き込み可能.

私はブランクがなく使い方向::iterator_adaptorを開始。

こうい:

template<typename T>
class sparse_vector {
public:
    typedef size_t size_type;
    typedef T value_type;

private:
    typedef T& true_reference;
    typedef const T* const_pointer;
    typedef sparse_vector<T> self_type;
    struct ElementType {
        ElementType(size_type i, T const& t): index(i), value(t) {}
        ElementType(size_type i, T&& t): index(i), value(t) {}
        ElementType(size_type i): index(i) {}
        ElementType(ElementType const&) = default;
        size_type index;
        value_type value;
    };
    typedef vector<ElementType> array_type;

public:
    typedef T* pointer;
    typedef T& reference;
    typedef const T& const_reference;

private:
    size_type                                   size_;
    mutable typename array_type::size_type      sorted_filled_; 
    mutable array_type                          data_;

// lots of code for various algorithms...

public:    
    class sparse_iterator
        : public boost::iterator_adaptor<
          sparse_iterator                   // Derived
          , typename array_type::iterator            // Base (the internal array)
          , value_type              // Value
          , boost::random_access_traversal_tag    // CategoryOrTraversal
          > {...}

    class iterator_proxy {
          ???
    };

    class iterator
        : public boost::iterator_facade<
          iterator                          // Derived
          , ?????                           // Base
          , ?????              // Value
          , boost::??????    // CategoryOrTraversal
          > {
    };
};

また、この違法?

typedef boost::reverse_iterator<sparse_iterator> reverse_sparse_iterator;
役に立ちましたか?

解決

んだんに使いたい iterator_adaptor このケースでは-するために使用 iterator_facade です。

徹底解説: iterator_adaptors 使用できるし既存の反復子(たとえば std::list<int>::iterator を用いて再利用し、その挙動お序で繰り返し処理する反復子は、例えば.お序で繰り返し処理する反復子を返しま倍の値のリストでも再利用にフォーカストラバーサルコードからのiterator.又はその他の方法:するた反復子がスキップの一部の要素のリストが返す値は変わらず。るか、というと分からないと思いたいベースに反復子として再利用コードのみ)で反復子の基底構造のものといえばだから、帰れなかった私にとってない特にnonsparse反復子がどういうをプロキシを参照できるようになっていない使用原反復子 dereference() コードをフォーカストラバーサルは簡単です。また、ベースのご sparse_iterator 一部の反復子を実際に既存の配列の要素ます。

問題点はあるもののプロキシで、期待してはいけませんで仕事を完璧になく多くの競.その一つにconstのnonsparse反復子が返す value_type(), といった表現 iter->foo() るべきで value_type().foo() 場合に対応するエントリが存在しない.このポーズをとる pointer_proxy::operator->() 返もの operator->, 好ましくはポインタ(レコード店ディスクユニオン value_type()).を通じ、お客様のお役に立つ重要な問ポインタをか?可能性がある(つい物管理 boost::shared_pointer, したりすることも可能です返す shared_pointernew"dインスタンス).

のnonsparse反復子は、実施する必要性:

  • class reference_proxy
  • reference_proxy::operator& (ょうを返すポインター代理人)
  • reference_proxy::operator value_type&() のための定数の使用
  • reference_proxy::operator const value_type&() 非定数の使用
  • reference_proxy::foo() 他の foo() 会員機能のvalue_type(その他の表現のような (*it).foo() AFAIK動作しません)

  • class pointer_proxy

  • pointer_proxy::operator* (返reference_proxy)
  • pointer_proxy::operator-> (do something顕、上記参照)

のためのパラメーターの反復子のファサードはテンプレートをとるとき

  • Reference:の reference_proxy
  • Pointer:の pointer_proxy

の疎版が簡単になり:この場合は、この反復子が良い。試合の行動したい)の具体的運用が適正に行できるため、省略のためのパラメーターの iterator_adaptor (以外に、すべての実装されます。

のないコンパイル"の問題:挿入 typename.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top