-
26-09-2019 - |
質問
また二種類の反復子:
最初のセットの反復子は、点の任意の要素から設定設定.ばから読み取れますが、いずれの設定値は 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_pointer
へ new
"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
.