Как построить итераторы контейнера

Я хочу написать свой собственный контейнер, но я наткнулся на создание итераторов во время begin() а также end(),

Давайте представим, что это эквивалентно std::vector, но не специализируется на bool, Когда я печатаю std::vector<int>::iterator:: intellisense не показывает конструктор. Как они строят итератор на begin() а также end() звонки? я думаю что iterator класс должен быть членом контейнера, я не прав?

Я полагаю, что конструктор (ы) сделан частным, а контейнер сделан другом итератора. Тем не менее, я думаю, что что-то не так.

1 ответ

Решение

std::vector<T>::iterator означает, что есть что-то в std::vector<T> класс называется "итератор". Это может быть typedef:

template<typename T> class vector {

public:

    typedef {{something}} iterator;
};

(Примечание: для целей этого вопроса я игнорирую Allocator параметр шаблона, это не актуально).

Или это может быть полноценный внутренний класс.

template<typename T> class vector {

public:

    class iterator {

        // ...
    };
};

Это также может быть несколько других. Неважно, в чем дело. Единственное, что вам гарантировано, это то, что когда вы ссылаетесь на std::vector<T>::iteratorвы получите что-то, что соответствует требованиям итератора.

Для вашего контейнера вы также можете свободно реализовывать итератор вашего контейнера, который дает правильный результат.

Тем не менее, для вашего собственного итератора вам будет удобно иметь свой итератор для правильного наследования отstd::iterator, так как std::iterator будет автоматически объявлять некоторые вещи, которые должны быть у всех итераторов, если они должны беспрепятственно взаимодействовать с библиотекой C++.

Наконец, что касается того, "как они на самом деле конструируются", они могут быть построены любым способом. Обратите внимание, что вы не создаете явно итератор, вы используете begin(), end(), или же find()или... Итак, только контейнер заботится о том, как должен быть построен итератор. Это может быть открытый конструктор или частный конструктор, это полностью зависит от контейнера.

Другие вопросы по тегам