我有一个拥有std::vector
的课程,应该提供begin()
,end()
,cbegin()
和cend()
方法。由于我不想暴露实现细节,即我使用std::vector
,我必须拥有自己的迭代器。据我所知,这就是boost::iterator_adapter
的用途:它需要一些迭代器并将其包装在一个新的Iterator类型中 - &gt;我的std::vector<T>::iterator
成为MyClass::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;
};
这可能无法编译。
答案 0 :(得分:2)
不,你不能使用:using const_iterator = const iterator
。
const_iterator
就像T const *
一样。 const iterator
的工作方式类似于T * const
。
也就是说,你想要的是一个迭代器,它可以被修改为指向其他对象,但提供对这些对象的只读访问。相反,const iterator
给你的是一个迭代器,它本身不能被修改,但是对它引用的对象提供读/写访问权。