Категория итератора - PullRequest
2 голосов
/ 18 апреля 2010

В коде:

//I know that to get this effect (being able to use it with std algorithms) I can inherit like I did in line below:

    class Iterator //: public std::iterator<std::bidirectional_iterator_tag,T>

    {
    private:
        T** itData_;
    public:
        //BUT I WOULD LIKE TO BE ABLE TO DO IT BY HAND AS WELL
        typedef std::bidirectional_iterator_tag iterator_category;
        typedef T* value_type;//SHOULD IT BE T AS value_type or T*?
        typedef std::ptrdiff_t difference_type;
        typedef T** pointer;//SHOULD IT BE T* AS pointer or T**?
        typedef T*& reference;//SHOULD IT BE T& AS reference or T*&?
};

По сути, я спрашиваю, есть ли у меня переменная типа T ** в классе итераторов, верно ли, что тип значения для этого итератора будет T * и так далее, как я описал в комментариях в коде, прямо сейчас на соответствующие строки.
Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 апреля 2010

Определение в стандарте (раздел 24.3.2):

template<class Category, class T, class Distance = ptrdiff_t,
         class Pointer = T*, class Reference = T&>
struct iterator {
    typedef T value_type;
    typedef Distance difference_type;
    typedef Pointer pointer;
    typedef Reference reference;
    typedef Category iterator_category;
};

Как видите, значения по умолчанию:

typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;

Предполагается, что итерация выполняется над контейнером элементов типа T. Если ваш контейнер содержит элементы типа T*, то typedefs в вашем вопросе будет правильным.

2 голосов
/ 18 апреля 2010

Вы должны определить их как то, что вы хотите, чтобы они были. pointer и reference являются (такими же, как) типами возвращаемых операторов разыменования, которые вы будете определять для своего класса итератора (т. Е. operator->() и operator*() соответственно), поэтому вы хотите, чтобы эти операторы возвращали руководство, как вы хотите определить эти typedefs.

В комментарии вы предлагаете, что если бы вы унаследовали от std::iterator, это было бы от std::iterator<std::bidirectional_iterator_tag,T>. Вы можете посмотреть в Standard (как в ответе interjay) или в ваших заголовочных файлах, чтобы увидеть, какие typedefs это предоставит, что покажет вам, что вы хотите T, T* и T& соответственно, чтобы так же, как то, что это дало бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...