0

我有一个拥有 a并且std::vector应该提供begin()end()和方法的类。由于我不想公开实现细节,即我使用 a ,所以我必须有自己的迭代器。据我了解,这是为了:它需要一些迭代器并将其包装在一个新的迭代器类型中 -> my变成 then 。cbegin()cend()std::vectorboost::iterator_adapterstd::vector<T>::iteratorMyClass::iterator

首先,我对 boost::iterator_adapter 的理解是否正确,其次我可以避免编写第二个 const_iterator 而是例如 typedef it ( using const_iterator = const iterator)?

    class MyClass {
    public:
        iterator begin();
        // ...
    private:
        using container_t = std::vector;
        container_t<int> container;
    }

    class MyClass::iterator
      : public boost::iterator_adaptor<
            MyClass::iterator                     // Derived
          , container_t<int>::iterator            // Base
          , boost::use_default                    // Value
          , boost::random_access_traversal_tag >  // CategoryOrTraversal
    {
     public:
        iterator()
          : iterator::iterator_adaptor_() {}
        explicit iterator(const iterator::iterator_adaptor_::base_type& p)
          : iterator::iterator_adaptor_(p) {}
     private:
        friend class boost::iterator_core_access;
    };

这可能无法编译。

4

1 回答 1

2

不,你不能使用类似的东西:using const_iterator = const iterator.

Aconst_iteratorT const *. Aconst iteratorT * const.

也就是说,您需要的是一个迭代器,可以修改为指向其他对象,但提供对这些对象的只读访问。const iterator相反,将给你的是一个迭代器,它本身不能被修改,但提供对它所引用的对象的读/写访问权限。

于 2017-05-23T13:54:03.050 回答