比較的単純です。まず、 Node 構造体:
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 日」のことですか?それとも非常に高解像度の時計ですか? いずれにせよ、これらの「作成時間」の詳細はツリーには影響しません。
編集: ちょっと待って、ノードの一部だけが作成時間を知っている 1 つのツリー タイプが必要ですか? または、すべてのノードが作成時間を知るようにツリーを変更するだけですか? 私は #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
}