我不明白Bjarne的想法:
列表迭代器必须比简单更复杂 指向元素的指针,因为列表中的元素通常不会 知道该列表的下一个元素在哪里。因此,列表迭代器 可能是指向链接的指针
我知道列表的节点有指向下一个和前一个节点的指针。那么它“一般不知道”呢?
答案 0 :(得分:2)
相比之下,让我们考虑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 *
的别名,它将无法正常工作。当你试图在迭代器上做++
时,它只会递增指针,而不是像你需要的那样带你到链表中的下一个元素。
您需要在迭代器类中构建一些智能,因此operator ++(例如)知道“追逐”指针而不是仅仅递增。
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;
}
};
};
答案 1 :(得分:1)
不要将列表节点与列表元素混淆。 可能是指针,但是指向包含元素和next / prev链接的节点。如果它只是指向元素的指针,那么你将无法随身携带它。 (虽然它不太可能只是指针,因为它通常必须重载operator ++以获取下一个指针而不是递增自身)。
对于intrusive列表不是这样,其中node ==元素,但那不是std :: list。
// illustrative
template <typename ElementType>
struct list_node {
ElementType element;
list_node *next, *prev;
};