它相对简单。首先,节点结构:
template<typename T> struct Node {
Node(T t) : value(std::move(t)), time(RightNow()) {}
T value;
TimeType time;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
快速帮手make_unique
:
template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args...)));
}
template<typename T> void Tree<T>::Insert(T key) {
auto z = make_unique<Node<T>>(std::move(key));
// insert
}
首先,我修复了你的蹩脚new
并delete
用智能指针替换它。然后我还把你的树作为模板,因为谁需要只能做一种类型的树?const T&
然后我用 a换掉了你的,T
这样它就可以和只移动类型一起使用了。
然后我只是添加了一个 Time 字段并在构造函数中调用了 RightNow()。您使用的确切 TimeType 和 RightNow() 取决于您的需求以及“创建时间”的确切含义。我们是在谈论“2013 年 7 月 6 日”吗?还是一个非常高分辨率的时钟?在任何情况下,这些“创建时间”细节都不会影响树。
编辑:等等,你想要一种只有一些节点知道创建时间的树类型吗?或者只是改变树以便所有节点都知道创建时间?我做了 #2,但对于 #1,你确实可以简单地从 Node.js 继承。以机智,
template<typename T> struct Node {
Node(T t) : value(std::move(t)) {}
T value;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
template<typename T> struct NodeWithTime : Node<T> {
TimeType time;
NodeWithTime(T t) : Node(std::move(t)), time(RightNow()) {}
};
template<typename T> void Tree<T>::insert(T t) {
std::unique_ptr<Node> nodeptr;
if (IWantToStoreCreationTime)
nodeptr = make_unique<NodeWithTime<T>>(std::move(t));
else
nodeptr = make_unique<Node>(std::move(t));
// insert
}