【问题标题】:Questions about the standard library list关于标准库列表的问题
【发布时间】:2013-11-09 22:14:10
【问题描述】:

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

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

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

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

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

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

tyepdef T* iterator;

列表的迭代器是

typedef node* iterator;

其中节点类似于:

template <class T> struct node {
    node() { next = 0; }
    node(T i, node* n = 0) : data(i), next(n) {}
    node* next;
    T data;
}

如果是这种情况,似乎取消引用等操作将不得不重载。

【问题讨论】:

  • 欢迎来到 1995。迭代器可以根据节点指针来实现,而且确实经常如此。然而,它们是抽象数据类型,并且绝对是 notnode 指针。如果是这样,++ 之类的运算符将无法处理它们。

标签: c++


【解决方案1】:

std::list&lt;T&gt;::iterator 对象在内部指向一个节点,但具有适当地跟随指向下一个或前一个节点的指针的运算符。也就是说,它们不是指针,因为增加一个指针只是增加一个而不是跟随一个链接。你可以想象一个列表迭代器看起来有点像这样:

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

【讨论】:

  • 这个迭代器类是否嵌套在列表类中?
  • @Dochevsky:标准没有指定迭代器类型是否嵌套在类中。我也不确定它是否可以被检测到。显然,名称 list_iterator 不会被真正的实现使用(这个名称不是保留的),但从概念上讲,std::list&lt;T&gt;::iterator 看起来像这样(无论它是否真的存储了一个 Node* 或者,例如,一个 @987654326当然,@ 也没有指定)。
【解决方案2】:

列表上的迭代器应该与其他序列容器上的迭代器类似,例如vector。 IE。它应该表现得像一个指向 list::value_type 的指针,就好像它在一个数组或类似的东西中一样(使用 ++ 和 -- 执行预期的操作到下一个和上一个)。持有结构的内部并没有真正通过迭代器暴露出来。迭代器抽象通常使程序员不必考虑如何存储数据。将来,理论上您可以在不更改代码的情况下将 std::list 替换为 std::vector,只要您只使用两者都可用的操作即可。

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多