2010-05-16 4 views
14

После another question about iterators У меня есть некоторые сомнения относительно пользовательских контейнеров. В моем контейнере iterator является подклассом const_iterator, так что я получаю преобразование из неконстантного в const «бесплатно». Но разрешено ли это или есть какие-то недостатки или нерабочие сценарии для такой настройки?Может ли 'итератор' вводить только подкласс 'const_iterator'?

ответ

7

Да, это нормально. Вот как структурировано, например, реализация итераторов VC10 для vector. См. _Vector_iterator и _Vector_const_iterator в <vector>.

Кстати, писать итераторы сложно. Это стоит вашего времени, чтобы узнать и использовать библиотеку boost :: iterator.

+0

Я знаю, но в моем случае это небольшая библиотека, и я не хочу, чтобы она зависела от чего-либо, включая части Boost. – doublep

+0

Это уже хорошо, что некоторые реализации STL работают так. Вы случайно знаете статью в стандарте, в которой описываются итераторы и требования в целом? – doublep

+0

24.2 FCD (n3035.pdf) описывает итераторы и их требования –

0

Подумайте о случае, который потребует от вас изменения членов итератора.

+4

И? Думаю, вам нужно уточнить. – doublep

2

Подкласс для меня здесь странный, но есть проблема.

Даже если вы не хотите зависеть от деталей Boost, проверьте библиотеку Boost.Iterator и, особенно, разряды iterator_facade и iterator_adaptor.

Существует полномасштабный пример того, как написать iterator и const_iterator для вашего класса, не дублируя слишком много. Их идея состоит в том, чтобы написать шаблон iterator_base класса, который затем можно использовать для константных и неконстантных в линии:

template <class Value> class iterator_base; 

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

Проблема с подклассами является то, что вы должны затем предоставить виртуальный деструктор и вы (при строительстве const_iterator от iterator)

Так что, в отличие от других здесь, я не считаю это «прекрасным».

+2

«Вы должны предоставить виртуальный деструктор», но мои деструкторы ничего не делают. Даже если бы они это сделали, тип «итератора», вероятно, просто наследовал бы деструктор 'const_iterator', не делая ничего лишнего. «вы подвержены разрезанию» - не могли бы вы рассказать, я не понимаю, что вы имеете в виду здесь. – doublep

+1

Пример среза, 'iterator it; const_iterator cit = static_cast (it); '. Здесь, когда вы назначаете typecasted 'it'' 'cit', любые дополнительные переменные, которые вы добавили в' it', ** не ** копируются в 'cit'. Но я думаю, что все в порядке, потому что мы снова не можем упустить «итератор». – Hindol

Смежные вопросы