列表的元素和下一个元素的迭代器

时间:2012-05-02 21:50:54

标签: c++ list std

我不明白Bjarne的想法:

  

列表迭代器必须比简单更复杂   指向元素的指针,因为列表中的元素通常不会   知道该列表的下一个元素在哪里。因此,列表迭代器   可能是指向链接的指针

我知道列表的节点有指向下一个和前一个节点的指针。那么它“一般不知道”呢?

2 个答案:

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