我正在创建自己的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()
这样的东西看起来不太好。
答案 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::pointer
和YourTree::reference
,但这些通常只是值类型的*
和&
的别名。注意一致性。没有它,标准算法将无法工作。
由您决定value_type是什么。如果你愿意,它可能是Node
。然而,这可能令人困惑并且难以一致地实施。我会把它留给Type
。
答案 2 :(得分:0)
程序员期望it->method
等同于(*it).method
,因此operator->
应返回指向operator*
返回引用的相同内容的指针。通常应该是迭代器的值,因为这是获得该值的预期方式。
您可以将节点的方法公开为指针的方法,即称为it.method
,但它有点令人困惑,并且在大多数情况下,与将迭代器作为容器的方法相比,迭代器中需要额外的数据论点。这就是为什么STL总是使用容器的方法来获取迭代器。例如。 container.insert(iterator, value)
在value
后插入iterator
。