扩展类和实例化

时间:2013-07-06 12:06:48

标签: c++ algorithm tree application-design red-black-tree

假设我们有一个RedBlack-Tree实现,它由2个类组成:

  • Tree - 保存指向树Node *root的指针,并定义树上的所有操作(InsertDelete等)
  • Node - 一个数据存储,包含指向Node *parentNode *leftNode *right节点和std::string key的指针。

Tree::Insert()具有以下实现:

void Tree::Insert(const std::string &key)
{
    Node *z = new Node(key);
    // adding node logic
}

现在任务:每个节点都必须存储其创建时间。

限制:应尽可能少地修改基础树实现,并应包含特定扩展的详细信息(因此它应该对创建时间属性一无所知)。

我的想法:扩展NodeWithTime : Node并添加unsigned int creation_time属性。

我陷入困境:我们现在如何实例化节点?

任何提案?

PS:它既不是家庭作业也不是工作任务 - 我只是学习c ++和数据结构。

1 个答案:

答案 0 :(得分:1)

这相对简单。首先,节点结构:

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
}

首先,我修复了你的蹩脚newdelete并用智能指针替换它。然后我也让你的树成为模板,因为谁需要一棵只能做一种类型的树呢?然后我用const T&换了你的T,以便它可能只使用移动类型。

然后我刚刚在构造函数中添加了一个Time字段并调用了RightNow()。您使用的确切TimeType和RightNow()取决于您的需求以及“创建时间”的具体含义。我们在谈论“2013年7月6日”吗?还是一个非常高分辨率的时钟?无论如何,这些“创建时间”细节不会影响树。

编辑:等等,您想拥有一种树类型,其中只有部分节点知道创建时间?或者只是改变树,以便所有节点知道创建时间?我做了#2,但对于#1,你确实可以简单地从Node继承。好的,

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
}