Ich schrieb einen spärlichen Vektor Klasse (siehe #1, #2.)Mit boost :: Iterator
Ich möchte zwei Arten von Iteratoren bieten:
Der erste Satz, die regulären Iteratoren kann jeder Punkt Element, ob gesetzt oder nicht gesetzt. Wenn sie gelesen werden, geben sie entweder den gesetzten Wert oder value_type()
zurück, wenn sie geschrieben werden, erzeugen sie das Element und geben die lvalue-Referenz zurück. So sind sie:
Random Access Traversal Iterator und Lesbare und Beschreibbare Iterator
Der zweite Satz, die spärlich Iteratoren iterieren nur die Set-Elemente. Da sie träge keine Elemente erstellen müssen, die geschrieben werden, sind sie:
Random Access Traversal Iterator und Lesbare und Beschreibbare und L-Wert Iterator
Ich brauche auch const Versionen von beiden, die nicht beschreibbar sind.
Ich kann die Lücken ausfüllen, aber nicht sicher, wie boost :: iterator_adaptor zu starten.
Hier ist, was ich bisher:
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
> {
};
};
auch, ist dies illegal?
typedef boost::reverse_iterator<sparse_iterator> reverse_sparse_iterator;
Ja, ich denke, Sie sind richtig für einen der Iteratoren ... Ich habe die Frage aktualisiert. –
Was Sie beschreiben, ist genau das, was ich will, ja. –
Wie kann ich das mehrmals aufwerten? :) –