비교적 간단합니다. 첫째, 노드 구조체 :
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&
을 T
으로 바꾸어 이동 전용 유형으로 사용할 수 있도록했습니다.
그러면 시간 필드를 추가하고 생성자에 RightNow()를 호출했습니다. 사용하는 정확한 TimeType 및 RightNow()는 필요에 따라 달라지며 "작성 시간"이 정확히 무엇인지 의미합니다. 2013 년 7 월 6 일에 대해 이야기하고 있습니까? 아니면 매우 높은 해상도의 클럭? 어쨌든 이러한 "생성 시간"세부 정보는 트리에 영향을주지 않습니다.
편집 : 잠깐만, 노드 중 일부에서만 생성 시간을 알고있는 트리 유형 하나를 갖고 싶습니까? 또는 단지 나무를 변경하여 모두 노드가 생성 시간을 알고 있습니까? 나는 # 2를했지만, # 1에서는 실제로 노드를 상속받을 수있었습니다. 위트로,
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
}
"확장"은 Java 용어입니다. C++에서는 ** 클래스에서 ** 파생됩니다. –