Как построить итераторы контейнера
Я хочу написать свой собственный контейнер, но я наткнулся на создание итераторов во время 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()
или... Итак, только контейнер заботится о том, как должен быть построен итератор. Это может быть открытый конструктор или частный конструктор, это полностью зависит от контейнера.