Для контраста, давайте рассмотрим итератор для std::vector
. Хотя вы, вероятно, не хотят чтобы, вы могли бы в принципе реализовать его как простой указатель:
template <class T>
class vector {
T *data;
size_t current_size;
size_t alloc_size;
public:
typedef T *iterator;
iterator begin() { return data; }
iterator end() { return data+current_size; }
// ...
};
и поскольку данные в векторе смежный, когда вы делаете (например) ++
на итератор, он поступил бы правильно (вы попадете в следующий элемент в векторе).
Со связанным списком это не может быть так просто - если вы использовали typedef
, чтобы сделать итератором псевдоним для T *
, это не сработает правильно. Когда вы попытались сделать ++
на итераторе, он просто увеличит указатель, а не приведет вас к следующему элементу связанного списка, как это необходимо.
Вам нужно создать некоторый интеллект в классе итератора, поэтому оператор ++ (на одном примере) знает, как «преследовать» указатель вместо того, чтобы просто увеличивать.
template <class T>
class list {
class node {
T data;
node *next;
node *prev;
};
public:
class iterator {
node *pos;
public:
iterator operator++() {
return pos = pos->next;
}
iterator operator--() {
return pos = pos->prev;
}
};
};
Разум, связанный с/упоминанием источника (возможно, для небольшого контекста)? – sehe
Он также, вероятно, сравнивает это с некоторыми реализациями std :: vector :: iterator', который может быть таким же простым, как 'T *' –
"* Я знаю, что узел списка имеет указатели на следующий и предыдущие узлы. Так как это «вообще не знает»? * «Это потому, что узел списка - это не просто указатель на элемент. Вы фактически повторяете то, что вы цитируете, другими словами. – ildjarn