Я написал разреженный векторный класс (см. # 1, #2.)
Я хотел бы предоставить два типа итераторов:
Первый набор, обычные итераторы, может указывать любой элемент, независимо от того, установлен он или нет. Если они считываются, они возвращают либо установленное значение, либо value_type(), если они записаны, они создают элемент и возвращают ссылку lvalue. Таким образом, они:
Итератор с отслеживанием случайного доступа и Читаемый и Writable Итератор
Второй набор, разреженные итераторы, перебирает только заданные элементы. Поскольку им не нужно лениво создавать элементы, которые записаны, они:
Итератор с отслеживанием случайного доступа и Readable и Writable и 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;