【问题标题】:When implementing a custom Iterator with boost::iterator_adapter, can I use the same class for mutable and const Iterators?使用 boost::iterator_adapter 实现自定义迭代器时,我可以对可变迭代器和 const 迭代器使用相同的类吗?
【发布时间】:2017-10-23 12:07:56
【问题描述】:

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

首先,我对 boost::iterator_adapter 的理解是否正确,其次我可以避免编写第二个 const_iterator 而是例如typedef 它(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;
    };

这可能无法编译。

【问题讨论】:

  • 你通过包装迭代器隐藏了什么,如果你只是转发“begin(),end(),cbegin()和cend()”,它不会隐藏?我不明白。如果性能在这里无关紧要,他们最简单和最灵活的方法可能只是一个 any_iterator

标签: c++ boost iterator boost-iterators


【解决方案1】:

不,您不能使用类似:using const_iterator = const iterator

const_iterator 的工作方式类似于 T const *const iterator 的工作方式类似于 T * const

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

【讨论】:

    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2022-11-20
    • 2011-03-26
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多