После another question about iterators У меня есть некоторые сомнения относительно пользовательских контейнеров. В моем контейнере iterator
является подклассом const_iterator
, так что я получаю преобразование из неконстантного в const «бесплатно». Но разрешено ли это или есть какие-то недостатки или нерабочие сценарии для такой настройки?Может ли 'итератор' вводить только подкласс 'const_iterator'?
ответ
Да, это нормально. Вот как структурировано, например, реализация итераторов VC10 для vector
. См. _Vector_iterator
и _Vector_const_iterator
в <vector>
.
Кстати, писать итераторы сложно. Это стоит вашего времени, чтобы узнать и использовать библиотеку boost :: iterator.
Подумайте о случае, который потребует от вас изменения членов итератора.
И? Думаю, вам нужно уточнить. – doublep
Подкласс для меня здесь странный, но есть проблема.
Даже если вы не хотите зависеть от деталей 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
)
Так что, в отличие от других здесь, я не считаю это «прекрасным».
«Вы должны предоставить виртуальный деструктор», но мои деструкторы ничего не делают. Даже если бы они это сделали, тип «итератора», вероятно, просто наследовал бы деструктор 'const_iterator', не делая ничего лишнего. «вы подвержены разрезанию» - не могли бы вы рассказать, я не понимаю, что вы имеете в виду здесь. – doublep
Пример среза, 'iterator it; const_iterator cit = static_cast
- 1. Почему emplace принимает итератор вместо const_iterator?
- 2. Можно ли хранить итератор?
- 3. `итератор` и` const_iterator` для C массивов в C++?
- 4. Он не сможет определить const_iterator от его коллеги итератор
- 5. Вектор, итераторы и const_iterator
- 6. нет жизнеспособного преобразования из возвращаемого значения типа const_iterator в итератор
- 7. Контейнеры const имеют только константный итератор?
- 8. Может только вводить одну вещь в Python
- 9. Должен ли регулярный итератор (или аналогичный класс/класс) получать из const_iterator?
- 10. Может ли назначение из разыменования const_iterator вызвать неопределенное поведение?
- 11. Как удалить константу const_iterator?
- 12. Может ли подкласс иметь меньше параметров, чем его подкласс?
- 13. Const Итератор Ссылка Итератор Ошибка
- 14. Может ли итератор друга использовать нестатические данные?
- 15. Может ли итератор списка возвращать неконстантную ссылку?
- 16. Может ли ржавчина использовать итератор в функции?
- 17. Только переместить итератор
- 18. Может ли подкласс также быть суперклассом?
- 19. Может ли конструктор backbone.js возвращать подкласс?
- 20. Может ли подкласс NetChannelInboundHandler быть совместимым?
- 21. Может ли подкласс UIViewController напрямую управлять UIImageView
- 22. Может ли подкласс событий wx :: StaticBoxSizer обрабатывать?
- 23. Может ли метод категории распространяться на подкласс?
- 24. Подкласс NSObject, может ли это вызвать проблемы?
- 25. Должен ли я подкласс только для UIAppearance
- 26. VHDL, Может ли часовой процесс вводить защелки?
- 27. Может ли Windsor вводить списки компонентов?
- 28. Может ли шаблон посетителя вводить дополнительные параметры
- 29. Может ли Угловой инжектор вводить метод?
- 30. Объект Cast в const_iterator вектора
Я знаю, но в моем случае это небольшая библиотека, и я не хочу, чтобы она зависела от чего-либо, включая части Boost. – doublep
Это уже хорошо, что некоторые реализации STL работают так. Вы случайно знаете статью в стандарте, в которой описываются итераторы и требования в целом? – doublep
24.2 FCD (n3035.pdf) описывает итераторы и их требования –