过去我使用节点实现了一个链表。
我正在查看标准库列表的一些属性,它有迭代器和相应的成员函数。
列表中的迭代器究竟是什么?它们是节点指针吗?
对于向量,基本上你有指向元素类型的指针,数据结构是在给定类型的底层动态数组上构建的。
对于列表,它似乎只是一系列节点,节点数组。那么迭代器是节点指针而不是指向节点数据类型的指针吗?
基本上我要问的是,对于一个向量,我有这个迭代器:
tyepdef T* iterator;
列表的迭代器是否
typedef node* iterator;
其中node类似于:
template <class T> struct node {
node() { next = 0; }
node(T i, node* n = 0) : data(i), next(n) {}
node* next;
T data;
}
如果是这种情况,似乎必须重新进行解除引用等操作。
答案 0 :(得分:0)
std::list<T>::iterator
个对象在内部指向一个节点但是具有适当遵循指向next或previoys节点的指针的运算符。也就是说,它们不是指针,因为递增指针只是添加一个而不是跟随一个链接。您可以将列表迭代器看起来像这样:
template <typename T>
class list_iterator {
friend list<T>
Node* node;
list_iterator(T* node):node(node) {}
list_iterator& operator++() {
node = node->next;
return *this;
}
T& operator*() { return *node; }
// ...
};
答案 1 :(得分:0)
列表上的迭代器的行为应与vector
等其他序列容器上的迭代器类似。即它应该像一个指向list :: value_type的指针,就好像它在数组或类似物中一样(使用++和 - 执行预期的操作转到下一个和上一个)。保持结构的内部不是通过迭代器实际暴露的。迭代器抽象通常使程序员不必考虑如何存储数据。在将来,理论上您可以在不更改代码的情况下将std::list
换成std::vector
,只要您只使用两者都可用的操作。