可以'iterator'类型只是子类'const_iterator'吗?

时间:2010-05-16 16:18:13

标签: c++ casting iterator containers

another question about iterators之后我对自定义容器有些怀疑。在我的容器中,iteratorconst_iterator的子类,因此我从非const转换为const“免费”。但是这样的设置是允许的还是有任何缺点或非工作方案?

3 个答案:

答案 0 :(得分:7)

是的,这很好。例如,这就是VC10对vector的迭代器实现的结构。请参阅_Vector_iterator中的_Vector_const_iterator<vector>

顺便说一下,编写迭代器很难。值得花时间学习和使用boost :: iterator库。

答案 1 :(得分:2)

这里的子类化似乎很奇怪,但实际上存在一个问题。

即使您不想依赖Boost部件,也请检查Boost.Iterator库,尤其是iterator_facadeiterator_adaptor位。

有一个完整的示例说明如何为您的班级写iteratorconst_iterator而不会重复太多。他们的想法是编写一个模板iterator_base类,然后您可以在以下行中使用const和非const类型:

template <class Value> class iterator_base;

typedef iterator_base<T> iterator;
typedef iterator_base<const T> const_iterator;

子类化的问题是你应该提供一个虚拟析构函数,然后你就会接触到切片(从const_iterator构建iterator时)

所以,与其他人不一样,我觉得它并不“很好”。

答案 2 :(得分:-1)

考虑一个需要修改迭代器成员的案例。