【问题标题】:How can I implement the constructor and destructor of this set template class?如何实现这个集合模板类的构造函数和析构函数?
【发布时间】:2020-08-01 15:24:59
【问题描述】:

我正在尝试使用 B 树(平衡树)结构实现一个集合模板类。 私有成员:'''data[MAXIMUM + 1]''' 具有树中当前节点的元素。 '''set* subset[MAXIMUM + 2]''' 具有指向当前集合的孩子的指针,这些孩子也是集合类型。 我正在尝试实现默认构造函数,它应该创建一个空集和一个使用函数 clear 清空集合的析构函数。但是,我不明白构造函数应该初始化什么以及析构函数会释放什么。这是文本中的代码:数据结构-Main,Savitch 4th edition-ch12,其中 Savitch 通过执行此模板集来解释 B 树。但是,他并没有经历构造函数和析构函数的实现。

代码如下:

template <class Item>
class set
{
public:
    // TYPEDEFS
    typedef Item value_type;
    // CONSTRUCTORS and DESTRUCTOR
    set();
    set(const set& source);
    ~set() { clear(); }
    // MODIFICATION MEMBER FUNCTIONS
    void operator =(const set& source);
    void clear();
    bool insert(const Item& entry);
    std::size_t erase(const Item& target);
    // CONSTANT MEMBER FUNCTIONS
    std::size_t count(const Item& target) const;
    bool empty() const { return (data_count == 0); }
    // SUGGESTED FUNCTION FOR DEBUGGING
    void print(int indent) const;
private:
    // MEMBER CONSTANTS
    static const std::size_t MINIMUM = 200;
    static const std::size_t MAXIMUM = 2 * MINIMUM;
    // MEMBER VARIABLES
    std::size_t data_count;
    Item data[MAXIMUM + 1];
    std::size_t child_count;
    set* subset[MAXIMUM + 2];
    // HELPER MEMBER FUNCTIONS
    bool is_leaf() const { return (child_count == 0); }
    bool loose_insert(const Item& entry);
    bool loose_erase(const Item& target);
    void remove_biggest(Item& removed_entry);
    void fix_excess(std::size_t i);
    void fix_shortage(std::size_t i);

【问题讨论】:

  • 析构函数应该释放所有东西。所以如果insert 分配了一些东西,那么析构函数也应该释放它。我会猜测析构函数应该通过子集数组删除那里的所有内容。但是,也许您会感到困惑,因为恕我直言,这是糟糕的类设计。它混淆了集合(这是一棵树)与构成树的节点。这里的set 类扮演了这两个角色。
  • 默认构造函数应该创建一个空集(即包含 0 个项目的集)。析构函数已经在 set 类中实现了。
  • subset 对于 B 树中的子数组来说不是一个好名字。非常混乱。 children 怎么样?
  • @john。我知道析构函数应该删除指向成员“子集”中集合的指针。但是,对于一个空集,构造函数应该为子集元素分配什么?因为如果什么都没有分配,那么 clear() 会释放什么?
  • 好吧,我看不到您现有的实现,但我想data_count 会告诉您有多少个子集。如果您有 N 个数据项,则您有 N + 1 个子集。空集是一种特殊情况,但是如果您将data_count 设置为零并将subsets[0] 设置为nullptr,那么我看不出有任何问题。但正如我所说,我看不到你现有的实现,所以我不能确定你应该如何完成它。

标签: c++ constructor set destructor b-tree


【解决方案1】:

如果我正确理解您的想法,child_countsubset 数组中有效条目的计数。如果是这样,请在默认构造函数中将其初始化为零。析构函数需要delete subset 的第一个child_count 元素。

对于数据,如果我理解正确的话,data_countdata 数组中有效条目的计数。如果是这样,您也需要将其初始化为 0。但是由于data元素是值而不是指针,它们在构造函数中被初始化并在析构函数中自动完成。

通常最好将原始存储与所有放置新机制一起使用,以防止创建 MAXIMUM + 1 项目,即使对于空节点,也允许 Items 根本没有默认构造函数,但这需要非常小心不要碰到UB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 2018-04-30
    • 2011-04-06
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2020-04-06
    • 2020-07-21
    相关资源
    最近更新 更多