2016-11-04 5 views
4

Я пишу класс итератора (скажем MyIterator) для библиотеки.Создать const iterator и non const iterator

Это хорошая идея использовать сопзЬ перегружать, чтобы сделать const MyIterator действует подобно const_iterator из std::vector в то время как MyIterator действует как как iterator из std::vector?

Будет ли запутан пользователь/разработчик библиотеки?

Реализация будет, как:

// std::iterator example 
#include <iostream>  // std::cout 
#include <iterator>  // std::iterator, std::input_iterator_tag 

class MyIterator : public std::iterator<std::input_iterator_tag, int> 
{ 
    mutable int* p; 
public: 
    MyIterator(int* x) :p(x) {} 
    MyIterator(const MyIterator& mit) : p(mit.p) {} 
    MyIterator& operator++() {++p;return *this;} 
    MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;} 
    bool operator==(const MyIterator& rhs) {return p==rhs.p;} 
    bool operator!=(const MyIterator& rhs) {return p!=rhs.p;} 
    const int& operator*() const {return *p;} // <-- const overload 
    int& operator*() {return *p;} 
}; 

Альтернатива будет использовать шаблоны для реализации одного класса итератора, который может быть специализирован в сопзЬ и неконстантные итераторы. В настоящее время я это делаю (я слышал, что boost делает это ...). Но шаблоны становятся сложными очень быстро, поскольку я реализую диапазон, а затем диапазон диапазона (как в вложенном диапазоне, основанный на цикле).

+1

Ад есть «мит»? Могу ответить на ваш вопрос. – George

+1

@George Я воспринимаю это как итератор, называемый 'mit'. Возможно, сокращенно для 'my_iterator'. – NathanOliver

+0

Я бы смутился, но это только я. – jrok

ответ

7

Используя const MyIterator как заменитель const_MyIterator (const_iterator) не будет работать, так как const_iterator не предназначен, чтобы быть константой итератора, но итератор итерации по постоянным элементам.

Кроме того, с const MyIterator, вы не могли бы использовать операторы модификации, как ++ или --, потому что это неконстантные методы модификации самого итератора.

Итак, если вы хотите предоставить своего рода const_iterator, вы не сможете обойти его.

Будет ли запутан пользователь/разработчик библиотеки?

Наконец, чтобы ответить на ваш вопрос: Да, я так думаю, из-за различного поведения (и ожиданий) в const iterator против const_iterator.

+0

он может работать. просто нужно определить, какой атрибут можно изменить, когда я реализую итератор. Я не уверен, что это хорошая идея. –

+0

@dotdotdot нет это абсолютно * не * хорошая идея. Просто потому, что что-то возможно, это не значит, что вы должны это делать. –

+0

Да, вы правы, это возможно технически. Но это добавило бы путанице и нарушало бы ожидания поведения объекта 'const'. –

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