疎なベクトル クラスを作成しました ( #1、#2を参照してください)。
2 種類の反復子を提供したいと思います。
最初のセットである通常の反復子は、設定されているかどうかに関係なく、任意の要素を指すことができます。それらが読み取られた場合は、セット値を返すか、value_type()
書き込まれた場合は、要素を作成して左辺値参照を返します。したがって、それらは次のとおりです。
ランダム アクセス トラバーサル イテレータと読み取り可能および書き込み可能なイテレータ
2 番目のセットであるスパース反復子は、セット要素のみを反復処理します。書き込まれる要素を遅延して作成する必要がないため、次のようになります。
ランダム アクセス トラバーサル イテレータおよび読み取り可能、書き込み可能、左辺値イテレータ
また、書き込み不可の両方の const バージョンも必要です。
空白を埋めることはできますが、boost::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;