another question about iterators之后我对自定义容器有些怀疑。在我的容器中,iterator
是const_iterator
的子类,因此我从非const转换为const“免费”。但是这样的设置是允许的还是有任何缺点或非工作方案?
答案 0 :(得分:7)
是的,这很好。例如,这就是VC10对vector
的迭代器实现的结构。请参阅_Vector_iterator
中的_Vector_const_iterator
和<vector>
。
顺便说一下,编写迭代器很难。值得花时间学习和使用boost :: iterator库。
答案 1 :(得分:2)
这里的子类化似乎很奇怪,但实际上存在一个问题。
即使您不想依赖Boost部件,也请检查Boost.Iterator库,尤其是iterator_facade
和iterator_adaptor
位。
有一个完整的示例说明如何为您的班级写iterator
和const_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)
考虑一个需要修改迭代器成员的案例。