树容器迭代器接口
Tree-container iterator interface
我正在制作自己的类似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::pointer
和YourTree::reference
,但这些通常只是值类型*
和&
的别名)。注意一致性。没有它,标准算法将无法工作。
由您来决定value_type是什么。如果你愿意,也可以是Node
。然而,这可能会令人困惑,并且难以始终如一地实现。我将保留它为Type
程序员期望it->method
等同于(*it).method
,因此operator->
应该返回指向operator*
返回引用的同一对象的指针。通常,这应该是迭代器的值,因为这是获得该值的预期方式。
可以将节点的方法公开为指针的方法,即称为it.method
,但这有点令人困惑,并且在大多数情况下,与将迭代器作为参数的容器的方法相比,它需要在迭代器中提供额外的数据。这就是为什么STL总是使用容器接受迭代器的方法。例如:container.insert(iterator, value)
在iterator
之后插入value
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 迭代器 STL C++是模板、类还是接口?
- 类型不可知的抽象以使用相同的运行时接口处理正向和反向迭代器和范围?
- 如何在基类中实现子类迭代器的统一接口?
- 迭代器的标准接口::operator*返回的比T&和std::p air更多
- C++:将成员容器的迭代器接口转发到类接口
- C++11 迭代器接口
- 是否有一个标准的包装器类通过迭代器和reverse_iterator提供统一的接口
- 在C++中,是否可以实现一个迭代器接口,其中推进会使"current"元素无效?
- 树容器迭代器接口
- 并发无锁单链表 C++ : 并发会影响接口吗?迭代器是否仍然有意义
- 如何为集合提供带有迭代器的 const 接口
- 为遗留的c链表接口提供c++迭代器
- STL算法:为什么没有额外的容器接口(除了迭代器对之外)