有关标准库列表的问题

时间:2013-11-09 22:14:11

标签: c++

过去我使用节点实现了一个链表。

我正在查看标准库列表的一些属性,它有迭代器和相应的成员函数。

列表中的迭代器究竟是什么?它们是节点指针吗?

对于向量,基本上你有指向元素类型的指针,数据结构是在给定类型的底层动态数组上构建的。

对于列表,它似乎只是一系列节点,节点数组。那么迭代器是节点指针而不是指向节点数据类型的指针吗?

基本上我要问的是,对于一个向量,我有这个迭代器:

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;
}

如果是这种情况,似乎必须重新进行解除引用等操作。

2 个答案:

答案 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,只要您只使用两者都可用的操作。