树容器迭代器接口

Tree-container iterator interface

本文关键字:接口 迭代器      更新时间:2023-10-16

我正在制作自己的类似stl的容器树,其中包含任意数量的子节点

template<typename Type>
class Node
{
    Type value;
    Iterator AddChild(const Type & value);
    void Remove(const Iterator & where);
    ...
};

我决定迭代器的operator*应该返回当前节点的value,但是什么应该返回operator-> ?目前,它返回Node<Type>*,它在这种情况下非常有用

Node<int>::Iterator it = tree.begin();
it->AddChild(4);

但是我的导师告诉我,operator->应该返回Type*。什么是类似stl的方式来访问Node的方法?像it.Ref().MyMethod()这样的东西看起来不太好。

你的导师是对的,operator->()的返回类型应该是Type*

迭代器背后的重要思想是,它们只是指向容器内某些位置的智能指针。您可以更改存储在该位置的值(通过分配给*it)或访问其成员,但要对容器内容进行更剧烈的(即结构)更改,您必须直接访问容器本身。

这就是为什么在STL中,没有节点的方法。相反,有一些容器方法(以及算法)接受迭代器作为参数。

换句话说,你要做的STL方法是:

Node<int>::Iterator it = tree.begin();
tree.AddChild(it, 4);

operator->应该返回YourTree::value_type*, operator*应该返回YourTree::value_type&。(实际上是YourTree::pointerYourTree::reference,但这些通常只是值类型*&的别名)。注意一致性。没有它,标准算法将无法工作。

由您来决定value_type是什么。如果你愿意,也可以是Node。然而,这可能会令人困惑,并且难以始终如一地实现。我将保留它为Type

程序员期望it->method等同于(*it).method,因此operator->应该返回指向operator*返回引用的同一对象的指针。通常,这应该是迭代器的值,因为这是获得该值的预期方式。

可以将节点的方法公开为指针的方法,即称为it.method,但这有点令人困惑,并且在大多数情况下,与将迭代器作为参数的容器的方法相比,它需要在迭代器中提供额外的数据。这就是为什么STL总是使用容器接受迭代器的方法。例如:container.insert(iterator, value)iterator之后插入value