树容器迭代器接口

时间:2013-03-29 09:23:50

标签: c++ stl iterator

我正在创建自己的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()这样的东西看起来不太好。

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:1)

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

由您决定value_type是什么。如果你愿意,它可能是Node。然而,这可能令人困惑并且难以一致地实施。我会把它留给Type

答案 2 :(得分:0)

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

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