类似STL的列表由带有节点

时间:2016-04-18 15:24:40

标签: c++ list templates linked-list

是否有可能为List编写模板(如在STL中),它将使用连接到自身的节点构成双链表,并提供使用开始或结束等迭代器的能力? 如果我有嵌套类:

class Node{
        T data;
        Node* previous, next;
        Node(T &data, Node* next);
    };

我的列表将有begin()函数:

template<class T>
class List {
  Node *data; //first element
  ...
  public:
  T* begin() { return data->data; }; //return content of the first element
  ...

我假设如果我想使用该列表,例如std :: copy function like

copy(l.begin(), l.end(), out);

然后复制函数使用“begin ++”遍历列表,然后它想要递增指向节点内“数据”对象的指针。然后它不会从下一个节点获取数据。 那么有可能制作这种清单吗?

1 个答案:

答案 0 :(得分:2)

首先,有std::list - 这可能是你想要的。

其次,begin()的实现不符合该函数返回容器的期望。你想要返回至少是模型ForwardIterator的东西(因为它是双重链接的,BidirectionalIterator)。基本上,这需要工作:

List<int> my_list = ...;
auto it = my_list.begin();
int& x = *it;  // first value in the list
++it;          // next element in the list
int& y = *it;  // next value in the list

现在,begin()产生List<int>::Node*。这取消引用List<int>::Node,但应取消引用int。错误的类型和泄漏抽象。增加指针编译,但它会指向内存中的某个任意位置而不是 next 节点。毕竟不能保证下一个节点在内存中相邻(几乎可以肯定它不是!)

所以你需要编写自己的迭代器类型,它包装你的Node类,它必须根据迭代器的概念正确地执行这些操作。基本上,您只是将迭代器概念操作映射到Node的外观。以您为例开始:

Node* underlying;

iterator& operator++() {
    underlying = underlying->next;
    return *this;
}

T& operator*() {
    return underlying->data;
}

另外,查看Boost的Iterator Facade库,这对正确编写迭代器很有帮助。