首页 > 解决方案 > 如何实现这个集合模板类的构造函数和析构函数?

问题描述

我正在尝试使用 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);

标签: c++constructorsetdestructorb-tree

解决方案


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

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

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


推荐阅读