2

我正在制作自己的类似 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*。访问 Node 方法的类似 STL 的方式是什么?类似的东西看起来it.Ref().MyMethod()不太好。

4

3 回答 3

4

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

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

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

换句话说,做你想做的事情的 STL 方式是:

Node<int>::Iterator it = tree.begin();
tree.AddChild(it, 4);
于 2013-03-29T09:44:56.543 回答
1

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

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

于 2013-03-29T09:42:07.127 回答
0

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

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

于 2013-03-29T10:02:44.497 回答