मैं एक विरल वेक्टर वर्ग लिखा था (#1 देखते हैं, #2।)का उपयोग को बढ़ावा देने :: iterator
मैं iterators के दो प्रकार प्रदान करना चाहते हैं:
पहला सेट, नियमित रूप से iterators, किसी भी इंगित कर सकते हैं तत्व, सेट या अनसेट करें। यदि उन्हें पढ़ा जाता है, तो वे या तो सेट मान या value_type()
लौटाते हैं, यदि वे लिखे गए हैं, तो वे तत्व बनाते हैं और lvalue संदर्भ लौटाते हैं। इस प्रकार, वे इस प्रकार हैं:
रैंडम एक्सेस Traversal इटरेटर और पठनीय और लिखने योग्य इटरेटर
दूसरे सेट, विरल iterators, से अधिक केवल सेट तत्वों पुनरावृति। चूंकि वे lazily तत्वों है कि करने के लिए लिखा जाता है बनाने के लिए की जरूरत नहीं है, वे हैं:
रैंडम एक्सेस Traversal इटरेटर और पठनीय और लिखने योग्य और lvalue इटरेटर
मैं भी स्थिरांक संस्करणों की आवश्यकता है दोनों, जो लिखने योग्य नहीं हैं।
मैं रिक्त स्थान भर सकता हूं, लेकिन यह सुनिश्चित नहीं कर सकता कि कैसे शुरू करने के लिए 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;
हाँ, मुझे लगता है कि आप एक इटरेटर के लिए सही हैं ... मैंने सवाल अपडेट किया है। –
क्या आप का वर्णन कर रहे हैं वास्तव में मैं क्या चाहते है, हाँ। –
मैं इसे कई बार कैसे बढ़ा सकता हूं? :) –